使用指向numpy数组数据属性的指针

时间:2013-01-25 04:22:42

标签: python numpy cython

我正在尝试解决我的应用程序中的瓶颈问题,这是两个矩阵的元素总和。

我正在使用NumPy和Cython。我有一个带有matrix属性的cdef类。由于Cython仍然不支持类属性中的缓冲区数组,因此我遵循this并尝试使用指向矩阵的data属性的指针。问题是,我确定我做错了,结果表明。

我试图做的或多或少如下:

cdef class the_class:
    cdef np.ndarray the_matrix
    cdef float_t* the_matrix_p

    def __init__(self):
        the_matrix_p = <float_t*> self.the_matrix.data

    cpdef the_function(self):
        other_matrix = self.get_other_matrix()


        the_matrix_p += other_matrix.data

2 个答案:

答案 0 :(得分:1)

我严重怀疑添加两个numpy数组是一个瓶颈,你可以解决用C重写的东西。参见下面的代码,使用scipy.weave

import numpy as np
from scipy.weave import inline

a = np.random.rand(10000000)
b = np.random.rand(10000000)
c = np.empty((10000000,))

def c_sum(a, b, c) :
    length = a.shape[0]
    code = '''
           for(int j = 0; j < length; j++)
           {
               c[j] = a[j] + b[j];
           }
           '''
    inline(code, ['a', 'b', 'c', 'length'])

运行c_sum(a, b, c)一次以编译C代码后,这些是我得到的时间:

In [12]: %timeit c_sum(a, b, c)
10 loops, best of 3: 33.5 ms per loop

In [16]: %timeit np.add(a, b, out=c)
10 loops, best of 3: 33.6 ms per loop

因此,如果时序差异不仅仅是随机噪声,那么在处理千万个元素阵列时需要花费少量ms的操作似乎正在寻找性能提升0.3%的东西。如果它确实是一个瓶颈,那么这很难解决它。

答案 1 :(得分:0)

尝试编译ATLAS并在此之后重新编译numpy。这对于添加可能没什么帮助,但是你可以通过更复杂的矩阵运算来提高性能(当然,如果使用这样的话)。

查看此simple benchmark。如果您的结果与帖子中给出的结果相差太远,那么您的numpy可能与某些优化的BLAS实现没有关联。