在Cython和Boost.Python中扩展NumPy的相对优势是什么?

时间:2017-01-23 19:07:01

标签: numpy cython boost-python

我需要加速一些在NumPy阵列上运行的算法。他们将使用std::vector和一些更高级的STL数据结构。

我已将我的选择缩小到Cython(现在包装大多数STL容器)和Boost.Python(现在内置支持NumPy)。

根据我作为程序员的经验,我知道有时需要使用框架来发现其隐藏的问题(因为它们很少被门徒用作谈话点),所以你的帮助可能会为我节省很多时间。

在Cython和Boost.Python中扩展NumPy的相对优势和劣势是什么?

2 个答案:

答案 0 :(得分:6)

这是一个非常不完整的答案,它只涵盖了它的几个小部分(如果我想到更多的话,我会编辑它):

提升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,它用数字模板化。根据您计划的代码,这可能是也可能不是问题。

答案 1 :(得分:3)

对于小的一次性问题,我倾向于喜欢cython,为了与c ++代码库进行更大的集成,更喜欢使用boost Python。

在某种程度上,它取决于您的代码的受众。如果您正在与具有丰富python经验的团队合作,但使用C ++的经验很少,那么Cython就有意义了。如果你有一个复杂类型的固定代码库来进行交互操作,那么boost python最终会比运行起来便宜一些。

Cython鼓励您逐步编写,逐步添加类型以获得额外的性能并解决许多硬包装问题。 boost Python需要花费大量精力来获得构建设置,并且很难生成在PyPI上有意义的包

Cython具有良好的内置错误消息/诊断功能,但从我所看到的情况来看,来自boost的错误很难解释 - 请善待自己并使用新的c ++编译器,最好是一个用于产生可读错误消息的文件。

不要对像numba这样的替代工具进行折扣(类似于使用Python代码的cython,而不仅仅是类似的东西)和pybind11(不使用boost来提升Python并提供更好的错误消息)

相关问题