gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:28:48 25 4
gpt4 key购买 nike

我需要加快一些处理 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 s 必须在函数的开头,因此 C++ 类在那里默认构造,然后分配给/操作(这可能有点低效)。对于简单用途之外的任何事情,您都不想在 Cython 中操作 C++ 类型(相反,最好用 C++ 编写代码然后从 Cython 调用它)。

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

关于numpy - 在 Cython 和 Boost.Python 中扩展 NumPy 的相对优势是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41813799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com