Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用Cython在Numpy数组上循环_Python_Arrays_Numpy_Cython - Fatal编程技术网

Python 用Cython在Numpy数组上循环

Python 用Cython在Numpy数组上循环,python,arrays,numpy,cython,Python,Arrays,Numpy,Cython,设a和b为两个numpy.float长度为1024的数组,用 cdef numpy.ndarray a cdef numpy.ndarray b 我注意到: cdef int i for i in range(1024): b[i] += a[i] 比以下速度慢得多: b += a 为什么? 我真的需要能够在阵列上手动循环 如果您告诉Cythona和b的数据类型和维度数,差异会更小: cdef numpy.ndarray[np.float64_t, ndim=1] a, b 虽

a
b
为两个
numpy.float
长度为1024的数组,用

cdef numpy.ndarray a
cdef numpy.ndarray b
我注意到:

cdef int i
for i in range(1024):
    b[i] += a[i]
比以下速度慢得多:

b += a 
为什么?


我真的需要能够在阵列上手动循环

如果您告诉Cython
a
b
的数据类型和维度数,差异会更小:

cdef numpy.ndarray[np.float64_t, ndim=1] a, b

虽然差异会更小,但您不会超过
b+=a
,因为这是使用NumPy的SIMD增强功能(这将根据您的CPU是否支持SIMD来执行)。

您被读取和跟踪了吗?我的意思是,我怀疑你在速度方面是否会超过b+=a,但你实际获得了什么样的速度?后者仍在使用Numpy自己的ufunc循环,根据Numpy的编译方式,它可以包括许多增强功能。前者没有,并且由于ndarray对象的索引速度较慢而进一步受到损害;提供的链接@ballsdotballs讨论了这一点以及如何修复它。只是一个旁注:
cdef float x
32位还是64位float?哪种cdef类型适用于numpy.float32、numpy.float64?我查看了文档,但没有找到精确的对应关系。为了将来参考,我检查了:
float numpy.float32
double numpy.float64=numpy.float
nditer
很好地处理了这样的循环。