Cython优化了numpy数组求和的关键部分

时间:2014-02-06 22:57:13

标签: python arrays numpy profiling cython

设L为列表L = [A_1, A_2, ..., A_n],每个A_i都是长度为1024的numpy.int32数组。

(大部分时间1000

经过一些分析后,我发现一个最耗时的操作就是求和:

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

PS:我认为我不能定义大小为1024 x n的2D数组,因为n未修复:某些元素被动态删除/添加到L中,因此len(L) = n可以在运行期间,在1000到4000之间变化。

使用Cython可以获得显着改善吗? 如果是这样,我应该如何对这个小函数进行cython重新编码(我不应该添加一些cdef输入?)

或者你能看到一些可能的其他改进吗?

1 个答案:

答案 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倍。