我需要加快一些处理 NumPy 数组的算法。他们将使用 std::vector
和一些更高级的 STL 数据结构。
我已经将选择范围缩小到 Cython(它现在包含了大多数 STL 容器)和 Boost.Python(它现在内置了对 NumPy 的支持)。
我从我作为程序员的经验中知道,有时需要花费数月的时间来处理一个框架才能发现其隐藏的问题(因为它们很少被其弟子用作谈话要点),因此您的帮助可能会为我节省很多时间。
在 Cython 和 Boost.Python 中扩展 NumPy 的相对优势和劣势是什么?
最佳答案
这是一个非常不完整的答案,只真正涵盖了其中的一小部分(如果我想到更多,我会对其进行编辑):
提升 doesn't look to implement operator[]
specifically for numpy arrays 。这意味着 operator[]
将来自基础 object
类(ndarray
继承),这意味着调用将通过 Python 机制对 __getitem__
进行,因此索引会很慢(接近 Python 速度)。如果您想快速进行索引,则必须自己进行指针运算:
// rough gist - untested:
// i,j,k are your indices
double* data = reinterpret_cast<double*>(array.get_data());
// in reality you'd check the dtype - the data may not be a double...
double data_element = array.strides(0)*i + array.strides(1)*j +array.strides(2)*k;
相比之下,Cython 具有自动内置的 numpy 数组的高效索引。
Cython 不擅长
std::vector
之类的东西(尽管它并不是绝对糟糕的——你通常可以欺骗它做你想做的事)。一个值得注意的限制是所有 cdef
都必须在函数的开头,所以 C++ 类在那里默认构造,然后分配给/操作(这可能有点低效)。对于简单用途之外的任何事情,您都不想在 Cython 中操作 C++ 类型(相反,最好用 C++ 编写代码然后从 Cython 调用它)。第二个限制是它与非类模板斗争。一个常见的例子是
std::array
,它是用数字模板化的。根据您计划的代码,这可能是也可能不是问题。关于numpy - 在 Cython 和 Boost.Python 中扩展 NumPy 的相对优势是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41813799/