设L为列表L = [A_1, A_2, ..., A_n]
,每个A_i
都是长度为1024的numpy.int32
数组。
(大部分时间1000 经过一些分析后,我发现一个最耗时的操作就是求和: PS:我认为我不能定义大小为 使用Cython可以获得显着改善吗?
如果是这样,我应该如何对这个小函数进行cython重新编码(我不应该添加一些 或者你能看到一些可能的其他改进吗?def summation():
# L is a global variable, modified outside of this function
b = numpy.zeros(1024, numpy.int32)
for a in L:
b += a
return b
1024 x n
的2D数组,因为n
未修复:某些元素被动态删除/添加到L中,因此len(L) = n
可以在运行期间,在1000到4000之间变化。cdef
输入?)
答案 0 :(得分:2)
这是Cython代码,确保L中的每个数组都是C_CONTIGUOUS:
import cython
import numpy as np
cimport numpy as np
@cython.boundscheck(False)
@cython.wraparound(False)
def sum_list(list a):
cdef int* x
cdef int* b
cdef int i, j
cdef int count
count = len(a[0])
res = np.zeros_like(a[0])
b = <int *>((<np.ndarray>res).data)
for j in range(len(a)):
x = <int *>((<np.ndarray>a[j]).data)
for i in range(count):
b[i] += x[i]
return res
我的一台电脑,它的速度提高了4倍。