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

Python 使用指向numpy数组数据属性的指针,python,numpy,cython,Python,Numpy,Cython,我试图解决应用程序中的瓶颈,即两个矩阵的元素和 我用的是NumPy和Cython。我有一个带有矩阵属性的cdef类。由于Cython仍然不支持类属性中的缓冲区数组,因此我遵循并尝试使用指向矩阵的数据属性的指针。问题是,我肯定我做错了什么,结果表明 我尝试做的大致如下: cdef class the_class: cdef np.ndarray the_matrix cdef float_t* the_matrix_p def __init__(self):

我试图解决应用程序中的瓶颈,即两个矩阵的元素和

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

我尝试做的大致如下:

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
cdef类\u类:
cdef np.ndarray_矩阵
cdef浮点*矩阵
定义初始化(自):
_matrix_p=self.the_matrix.data
cpdef_功能(自):
other\u matrix=self.get\u other\u matrix()
_矩阵_p+=其他_矩阵数据

我非常怀疑添加两个numpy数组是否是解决用C重写问题的瓶颈。请参阅以下代码,该代码使用:


因此,如果时序差异不是简单的随机噪声,那么在处理1000万个元素的阵列时需要几毫秒的操作上,您似乎看到了0.3%的性能改进。如果它真的是一个瓶颈,这很难解决它。

尝试编译ATLAS,然后重新编译numpy。这可能对加法没有帮助,但对于更复杂的矩阵运算,您可以获得非常好的性能提升(当然,如果您使用这样的操作)


看看这个。如果您的结果与文章中给出的结果相差太远,可能您的numpy与某些优化的BLAS实现没有关联。

那么,问题出在哪里?你犯了什么错误?是的,我想你是对的。经过几次测量后,我得出结论,我的代码速度与Python中的一样快。
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'])
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