2013-01-25 36 views
0

我试图解决我的应用程序中的瓶颈问题,这是两个矩阵的元素总和。使用指向numpy数组数据的属性属性

我使用NumPy的和用Cython。我有一个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 
+0

那么,有什么问题?你遇到了什么错误? –

回答

1

我有严重的怀疑,增加了两个numpy的阵列是可以解决C.重写的东西见follwing代码的瓶颈,即使用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 

因此,看来你正在寻找的0.3%的性能提升的东西,如果时间差异不是简单的随机噪声,上千万的元素阵列工作时考虑MS屈指可数的操作。如果它确实是一个瓶颈,这很难解决它。

+0

是的,我认为你是对的。经过几次测量后,我得出结论,我的代码和Python中的代码一样快。 – erickrf

0

尝试编译ATLAS,之后重新编译numpy的。这不会对添加有帮助,但通过更复杂的矩阵操作(当然,如果您使用这种操作),您可以获得非常好的性能提升。

看看这个simple benchmark。如果你的结果与帖子中的结果差得太远,也许你的numpy没有链接到一些优化的BLAS实现。