2016-06-30 2 views
4

저는 파이썬에서 다소 큰 시뮬레이션을 작성 중이며 Cython에서 추가 성능을 얻기를 희망했습니다. 그러나 아래의 코드에서는 다소 큰 루프가 포함되어 있지만 그다지 많은 것을 얻지 못하는 것 같습니다. 대략 100,000 반복.Cython 최적화

초보자가 실수로 작성했거나이 루프 크기가 ​​작아서 큰 영향을 주었습니까? (내 테스트에서 Cython 코드는 약 2 배 빨랐습니다).

import numpy as np; 
cimport numpy as np; 
import math 

ctypedef np.complex64_t cpl_t 
cpl = np.complex64 

def example(double a, np.ndarray[cpl_t,ndim=2] A): 

    cdef int N = 100 

    cdef np.ndarray[cpl_t,ndim=3] B = np.zeros((3,N,N),dtype = cpl) 

    cdef Py_ssize_t n, m; 
    for n in range(N): 
     for m in range(N): 

      if np.sqrt(A[0,n]) > 1: 
       B[0,n,m] = A[0,n] + 1j * A[0,m] 

    return B; 
+6

루프 내에서'np.sqrt' 호출을하고 있습니다. 성능 문제처럼 보입니다. 어쨌든 왜 루프에 있습니까? 'a'는 절대로 변하지 않습니다. 왜 'a <= 1 : 루프 앞에서 B'를 반환하는 것일까? – user2357112

+0

@GWW : 저에게 첫 번째 행처럼 보입니다. – user2357112

+0

@ user2357112 고마워요, 그건 제가 간과 한 것입니다. 나는 그것을 옮길 수 있습니다. 실제로, np.sqrt() 또는 np.exp()와 같은 수학 연산은 cython에서 피해야하는 대상입니까? – physicsGuy

답변

7

컴파일러 지시문을 사용해야합니다. 나는

import numpy as np 

def example_python(a, A): 
    N = 100 
    B = np.zeros((3,N,N),dtype = np.complex) 
    aux = np.sqrt(A[0]) 
    for n in range(N): 
     if aux[n] > 1: 
      for m in range(N): 
       B[0,n,m] = A[0,n] + 1j * A[0,m] 
return B 

와 사이 썬에

import cython 
import numpy as np 
cimport numpy as np 

ctypedef np.complex64_t cpl_t 
cpl = np.complex64 

@cython.boundscheck(False) # compiler directive 
@cython.wraparound(False) # compiler directive 
def example_cython(double a, np.ndarray[cpl_t,ndim=2] A): 

    cdef int N = 100 
    cdef np.ndarray[cpl_t,ndim=3] B = np.zeros((3,N,N),dtype = cpl) 
    cdef np.ndarray[float, ndim=1] aux 
    cdef Py_ssize_t n, m 
    aux = np.sqrt(A[0,:]).real 
    for n in range(N): 
     if aux[n] > 1.: 
      for m in range(N): 
       B[0,n,m] = A[0,n] + 1j * A[0,m] 
    return B 

내가 ~ 450 배 빠른 것보다

c = np.array(np.random.rand(100,100)+1.5+1j*np.random.rand(100,100), dtype=np.complex64) 

%timeit example_python(100, c) 
10 loops, best of 3: 61.8 ms per loop 

%timeit example_cython(100, c) 
10000 loops, best of 3: 134 µs per loop 

사이 썬이 두 기능 비교 (당신은 컴파일러 지시어 here에 대해 배울 수 있습니다) 파이썬

에서 함수를 썼다 이 경우에는 파이썬.

+0

고마워, 내가 정확히 찾고 있었던 것이었다! 필자는 아직 컴파일러 지시어에 대해 몰랐다. – physicsGuy