2013-01-25 4 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와 배열을 추가하는 것은 당신이 follwing을 코드를 참조하십시오 C.에 일을 다시 작성 해결할 수있는 병목 현상인지 심각한 의문을 가지고, 그 scipy.weave 사용

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 
:

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 코드를 컴파일 얻을 실행되면, 이러한 타이밍 내가 얻을 수 있습니다

그래서 1 천만 개 요소의 배열을 작업 할 때 몇 ms의 시간이 소요되는 작업에서 타이밍 차이가 단순히 랜덤 노이즈가 아닌 경우 .3 %의 성능 향상이있는 것으로 보입니다. 병목 현상이 실제로 발생한다면이 문제를 거의 해결할 수 없습니다.

+0

네가 맞다고 생각해. 몇 가지 측정을 마친 후에 필자는 코드가 파이썬에서 가능한 한 빠르다는 결론에 도달했습니다. – erickrf

0

ATLAS를 컴파일하고 그 후에 numpy를 다시 컴파일 해보십시오. 이것은 아마도 추가에 도움이되지 않지만, 더 복잡한 행렬 연산을 사용하면 성능이 상당히 향상 될 수 있습니다 (물론 그러한 것을 사용하는 경우).

체크 아웃은 simple benchmark입니다. 결과가 게시물에서 주어진 결과와 너무 먼 경우, numpy는 최적화 된 일부 BLAS 구현과 연결되지 않을 수 있습니다.