2016-12-13 2 views
1

안녕하세요, 저는 계산 속도를 높이기 위해 파이썬 코드를 cython으로 변환하려고합니다. 나는 cdef에서 cpdef으로 cython 코드 내에서 여러 배열을 반환하려고합니다. 클래식 C를 기반으로 포인터 나 튜플을 사용할 수 있습니다. 크기가 다양하기 때문에 튜플을 사용하기로 결정했습니다. 다음 코드는 작동하지 않는다는 것을 알고 있습니까? 고맙습니다!Cython에서 cdef 내에서 튜플을 반환합니까?

import numpy as np 
cimport numpy as np 

cdef tuple funA(double[:] X, double[:] Y): 
    cdef int nX, nY, i 
    nX = len(X) 
    nY = len(Y) 

    for i in range(nX): 
     X[i] = X[i]*X[i] 

    for i in range(nY): 
     Y[i] = Y[i]*Y[i] 

    return X,Y 

cpdef Run(double[:] X, double[:] Y) 
    cdef Tuple1, Tuple2 = funA(X,Y) 

    # Do some calculation with Tuple1 and Tuple2 
    # Example 

    cdef int i, nTuple1, nTuple2 

    nTuple1 = len(Tuple1)  
    for i in range(nTuple1): 
     Tuple1[i] = Tuple1[i]**2 

    nTuple2 = len(Tuple2) 
    for i in range(nTuple2): 
     Tuple2[i] = Tuple2[i]/2 

    return Tuple1, Tuple2 

답변

4

들여 쓰기 오류가 있거나 콜론이 누락되었습니다. 그러나 진짜 문제는 :

cdef Tuple1, Tuple2 = funA(X,Y) 

cdef를 제거하고 괜찮아요. 그것은 cdef처럼 보이지 않으며 튜플을 푸는 것은 꽤 섞여서, 파이썬 객체로 취급하기 때문에 괜찮을 것입니다.

XY을 수정하여 실제로는 funA에서 아무것도 반환 할 필요가 없습니다.

+0

내가 제안한대로 cdef를 제거하면 "예상되는 식별자 또는 리터럴"을 얻게됩니다. cpdef에서 예제를 제공 할 수 있습니까? 2 개의 배열을 반환하는 funA 함수를 호출합니까? 고맙습니다! – user4627923

+0

이전 줄에 콜론이 없어서 그런 것 같습니다. – DavidW

+0

와우 나는 지금 바보처럼 보인다. 하하는 고마운 친구 다 .-) – user4627923