2014-11-29 2 views
1

나는 numpy 속도를 높이기 위해 cython을 배우고있다. numpy 배열 계산을 최적화하는 방법을 알려주는 코드를 작성했습니다. 파이썬 코드는 다음과 같습니다cython을 학습하는 동안의 문제

from numpy import * 

def set_onsite(n): 
    a=linspace(0,n,n+1) 
    onsite=zeros([n+1,n+1],float) 
    for i in range(0,n+1): 
     onsite[i,i]=a[i]*a[i] 
    return onsite 

그런 다음,이 코드 cythonize하려고 : setup.py 파일을 실행 한 후

import numpy as np 
cimport numpy as np 
cimport cython 
import cython 

@cython.boundscheck(False) 
@cython.wraparound(False) 
@cython.nonecheck(False) 

def set_onsite(np.int_t n): 
    cdef np.ndarray[double,ndim=1,mode='c'] a=np.linspace(0,n,n+1) 
    cdef np.ndarray[double,ndim=2,mode='c'] onsite=np.empty(n+1,n+1) 
    cdef np.int_t i 

    for i in range(0,n+1): 
     onsite[i,i]=a[i]*a[i] 
    return onsite 

을, 나는 .so를 파일을 얻었다. 나는 코드 %timeit myfile.set_onsite(10000)를 실행하지만, IPython은

TypeError: data type not understood

그래서 사람이 여기에 무슨 일이 일어나고 있는지 말해 줄 수를 보여? 코드를 여러 번 확인했지만 문제가 발생한 위치를 파악하지 못했습니다.

답변

4

문제는 cython과 아무런 관련이 없습니다. np.empty은 첫 번째 인수가 int 또는 int의 튜플로 제공된 모양이 될 것으로 예상합니다. 두 번째 인수는 DTYPE로 해석됩니다 :

In [19]: np.empty(5,5) 
TypeError: data type not understood 

np.empty((5,5)) 동안 돌아 모양 (5,5)의 빈 배열을. 그래서 대신 n+1, n+1 주위

cdef np.ndarray[double,ndim=2,mode='c'] onsite=np.empty((n+1,n+1)) 

주에게 괄호의 이중 설정을 사용합니다. 또는 np.empty 대신 np.zeros을 사용하여 Cython 함수를 Python 함수와 일치 시키십시오.

PS : 파이썬을 디버깅 할 때 오류 메시지 만 예외 제기 줄뿐만 아니라주의하는 것이 도움이된다 :

File "comp.pyx", line 13, in comp.set_onsite (comp.c:1290) 
    cdef np.ndarray[double,ndim=2,mode='c'] onsite=np.empty(n+1,n+1) 
TypeError: data type not understood 
+0

당신에게 너무 많은 감사를! 그것은 작동합니다. 하지만 또 다른 질문이 있습니다. 나는 시간을 계산한다. 결과는 매우 가깝습니다. 어쨌든 Cython을 사용하여 더 빠르게 만들 수 있습니까? – spind

+0

죄송합니다, 성능을 향상시킬 방법을 모르겠습니다. 내가 Cython을 잘 모르기 때문에 새로운 질문을하고 싶을 수도 있습니다. – unutbu

관련 문제