我仍然在开始了解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
你有什么建议吗?
答案 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
...