我需要加快一些在NumPy数组上工作的算法.他们将使用std::vector
一些更先进的STL数据结构.
我已将我的选择范围缩小到Cython(现在包装大多数STL容器)和Boost.Python(现在内置支持NumPy).
根据我作为程序员的经验,我知道有时需要几个月的时间来使用框架来揭示其隐藏的问题(因为它们很少被其门徒用作谈话点),所以你的帮助可能会为我节省大量时间.
在Cython和Boost.Python中扩展NumPy的相对优缺点是什么?
这是一个非常不完整的答案,只能真正涵盖它的几个小部分(如果我想到更多,我会编辑它):
Boost 并不operator[]
专门针对numpy数组实现.这意味着operator[]
它将来自基object
类(ndarray
继承),这将意味着调用将通过Python机制__getitem__
,因此索引将很慢(接近Python速度).如果你想以高速进行索引,你必须自己做指针算法:
// rough gist - untested:
// i,j,k are your indices
double* data = reinterpret_cast(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
s都必须在函数的开头处进行,因此C++类在那里默认构造,然后分配给/稍后操作(这可能有些低效).对于除了简单用途之外的任何事情,你不希望在Cython中操作C++类型(相反,最好用C++编写代码然后从Cython中调用它).
第二个限制是它与非类模板斗争.一个常见的例子是std::array
,用数字模板化.根据您计划的代码,这可能是也可能不是问题.