当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在Cython和Boost.Python中扩展NumPy的相对优势是什么?》经验,为你挑选了1个好方法。

我需要加快一些在NumPy数组上工作的算法.他们将使用std::vector一些更先进的STL数据结构.

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

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

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



1> DavidW..:

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


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(虽然它并不是非常糟糕 - 你通常可以欺骗它做你想做的事情).一个值得注意的限制是所有cdefs都必须在函数的开头处进行,因此C++类在那里默认构造,然后分配给/稍后操作(这可能有些低效).对于除了简单用途之外的任何事情,你不希望在Cython中操作C++类型(相反,最好用C++编写代码然后从Cython中调用它).

第二个限制是它与非类模板斗争.一个常见的例子是std::array,用数字模板化.根据您计划的代码,这可能是也可能不是问题.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有