在Cython中加速for循环

时间:2016-11-23 22:47:16

标签: python cython

我仍然在开始了解Cython的工作原理。 这个片段显示了我的程序的一个缓慢的部分,我想知道这个for循环是否可以改进。 它仍然看起来像原始的Numpy版本,但我添加了cdef和int转换。

cdef Py_ssize_t i, j
cdef double ii, jj

for ii in np.arange(startx, endx+1, 0.1):
    for jj in np.arange(starty, endy+1, 0.1):
        if my_condition(ii, jj):
            i = <int>ii
            j = <int>jj
            data[i, j] += 1

你有什么建议吗?

2 个答案:

答案 0 :(得分:2)

研究

中的cython示例

https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html

使用nditer分发数组元素。

https://cython.readthedocs.io/en/stable/src/userguide/memoryviews.html

演示了如何使用memoryviews(和C数组)快速迭代值。

无论哪种方式,你的目标都是让cython直接访问databuffer,而不是通过numpy函数。

答案 1 :(得分:0)

我知道这是一个老问题,但我遇到了同样的问题并找到了这个简单的解决方案。

https://github.com/cython/cython/issues/3310#issuecomment-707252866

for i in range(start, stop, step):
    ...

为此:

i = start - step
for _ in range(((stop - start) + (step - 1))//step):
    i += step
    ...