2013-01-25 35 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實現。