2013-01-06 3 views
2

나는 현재 사이 썬 다음 루프를 변환하기 위해 노력하고있어 :파이썬 - 파이썬 호출을 제거

cimport numpy as np 
cimport cython 
@cython.boundscheck(False) # turn of bounds-checking for entire function 
def Interpolation(cells, int nmbcellsx): 
    cdef np.ndarray[float, ndim=1] x,y,z 
    cdef int i,j,len 
    for i in range(nmbcellsx): 
     x = cells[i].x 
     y = cells[i].y 
     z = cells[i].z 
     len = x.size 
     for j in range(len): 
     x[j] = x[j] * y[j] * z[j] 

    return 0 

지금까지 모든 종류의 좋아 보이지만, [i]를 세포에 액세스 * 여전히 필요합니다. 파이썬 호출합니다. 이렇게하면 i- 루프의 병렬화가 방지됩니다. 여기

는 사이 썬 피드백 (사이 썬 -a를 생성)되어

cython -a feedback

그러므로 질문 : 이러한 파이썬 콜백 (즉되도록 라인 9-12 화이트가)을 제거 할 수 있는가?

나는이 같은 셀의 유형을 추가 할 때 :

cimport numpy as np 
cimport cython 

cdef class cell_t: 
    cdef np.ndarray x,y,z 

@cython.boundscheck(False) # turn of bounds-checking for entire function 
def Interpolation(np.ndarray[cell_t,ndim=1] cells, int nmbcellsx): 
    cdef np.ndarray[float, ndim=1] x,y,z 
    cdef int i,j,len 
    for i in range(nmbcellsx): 
     x = cells[i].x 
     y = cells[i].y 
     z = cells[i].z 
     len = x.size 
     for j in range(len): 
     x[j] = x[j] * y[j] * z[j] 

    return 0 

을 나는 다음과 같은 사이 썬 오류가 나타날 수 DTYPE은 "개체", 숫자를 입력하거나 구조체 (가 cell_t에 대해 불평해야합니다 선언 내)

고마워요.

+1

유형 중 여기

cimport cython cdef class cell_t: cdef public float[:] x, y, z def __init__(self, x, y, z): self.x = x self.y = y self.z = z @cython.boundscheck(False) # turn of bounds-checking for entire function def Interpolation(cell_t[:] cells, int nmbcellsx): cdef float[:] x,y,z cdef int i,j,length cdef cell_t cell for i in range(nmbcellsx): cell = cells[i] x = cell.x y = cell.y z = cell.z length = len(x) for j in range(length): x[j] = x[j] * y[j] * z[j] return 0 

테스트 코드입니다. Cython에 힌트를 주면 그것을 인식하게 만들 수 있습니다. – Wessie

+1

사이드 노트로. 루프와 관련된 함수에서 아무 것도 반환하지 않는 것처럼 보이거나 루프가 로컬이 아닌 다른 것을 돌연변이시키지 않습니다. 그냥 머리 - 업. – Wessie

+0

이것은 더 복잡한 기능의 단순한 예입니다. 셀 (Cell)은 실제로 호출 셀 (Cell) 개체의 누드 ndarray입니다. Cell 클래스가 numpy 배열 x, y, z만을 가집니다. 이 문제를 어떻게 해결할 수 있습니까? – user1829358

답변

2

당신은 사이 썬 당신의 cells 인수의 유형을 말하고 있지 않으며 따라서는 파이썬는 방법을 찾아 사용합니다. 다음에 정의를 변경해보십시오 :

def Interpolation(np.ndarray cells, int nmbcellsx):

이 그것을 C 액세스를 사용할 수 있습니다 따라서 ndarray 유형을 얻고있다 사이 썬을 알려드립니다.

+0

불행히도이 변경 사항은 없습니다. 내 생각 엔 Cython에 셀의 정확한 구성을 알려주지 만 어떻게해야합니까? Btw. 당신은 위의 예제를 "cython -a file.py"로 컴파일 한 다음 생성 된 file.html을보실 수 있습니다 (9-12 줄은 흰색이 될 필요가 있습니다) – user1829358

2

Typed Memoryview을 사용하면 어떨까요?

import numpy as np 
from cells import cell_t, Interpolation 

x = np.array([1,2,3], np.float32) 
y = np.array([4,5,6], np.float32) 
z = np.array([7,8,9], np.float32) 
c1 = cell_t(x, y, z) 

x = np.array([1,1,1,1,1], np.float32) 
y = np.array([2,2,2,2,2], np.float32) 
z = np.array([3,3,3,3,3], np.float32) 
c2 = cell_t(x, y, z) 

cells = np.array([c1, c2], object) 

Interpolation(cells, 2) 

print c1.x.base 
print c2.x.base 

출력 : 다음`cells` 인수입니다

[ 28. 80. 162.] 
[ 6. 6. 6. 6. 6.] 
+0

고맙습니다. 이것은 실제 해결책에 매우 가깝지만 병행성에는 여전히 하나의 사소한 장애가 있습니다. Cython은 x, y, z 배열이 NULL이 아닌 몇 가지 검사를 추가하는 것 같습니다 ([여기] (http://i48.tinypic.com/jqgyhk.png) 참조). [이 페이지] (http : //wiki.cython.org/enhancements/compilerdirectives)이 체크를 끄는 옵션을 찾을 수 없습니다. 이것이 가능한지 아십니까? 측면 노트에서 목표는 21 행의 주석 처리를 제거하는 것입니다. – user1829358