2014-05-16 2 views
4

파이썬 목록을 반복하는 cython 함수에 보내면 목록 항목이 어떤 유형인지 선언해야할까요? 또한 cython으로 목록을 반복하는 가장 좋은 방법은 무엇입니까? 예 :항목 유형을 cython에서 정의해야합니까?

#Cython function, passed a list of float items 
def cython_f(list example_list): 
    cdef int i 
    for i in range(len(example_list)): 
     #Do stuff 
     #but list item type not defined? 
     pass 

    #Alternative loop 
    cdef j float #declaration of list item type 
    for j in example_list: 
     #Do stuff 
     pass 

* 편집 : 목록 항목 유형을 정의 할 때 속도가 향상 되었습니까? 파이썬리스트 대신 numpy 배열을 전달하는 것이 더 좋습니까? 많은 질문에 사과드립니다.

답변

9

Cython에서는 아무 것도 선언 할 의무가 없습니다. 신고 유형은 이며 일반적으로입니다. 은 일반적으로입니다. 유형을 선언했지만 사용하지 않으면 유형 검사 및 압축 풀기가 발생할 수 있기 때문입니다. 확신 할 수있는 유일한 방법은 측정하는 것입니다.

목록의 유형을 선언하려면 시작 부분에 cdef float value을 넣고 value = example_list[i] 루프에 넣으십시오.

목록 또는 numpy 배열을 사용해야합니까? 배열은 일정한 데이터 컨테이너입니다. 즉, float32_t 인 것으로 선언 할 수 있으며 Cython은 C 속도로 작업하는 방법을 알고 있습니다 (액세스가 더 빠르다는 것은 메모리에서 연속적이고 스트라이드됨을 보장하므로). 반면에 크기를 바꾸려면 목록을 사용하는 것이 좋습니다 (매우 많이 사용하는 경우는 아마도 libcpp.vector). 그래서 대답은 당신이하는 일에 달려 있지만 대부분의 경우 배열이 더 좋습니다.

공정하게하려면 데이터가 어떻게 살아 있는지 고려해야합니다. 목록에 모든 항목이 있으면 배열 기능이 더 빠르지 만 list -> array -> f_array -> array -> listlist -> f_list -> list보다 느릴 수 있습니다. 어림짐작하지 않는 한 길이가 일정 할 때 배열을 사용하고 그렇지 않으면 배열을 사용하십시오. 또한 엄청난 양의 배열은 많은 양의 데이터를 저장할 때 메모리가 가볍습니다.

+0

감사합니다. 훌륭한 답변입니다. – kezzos

+2

'libcpp.vector' 대신'cpython.array' (http://stackoverflow.com/questions/18462785/what-is-the-commended-way를 참고하십시오)라는 몇 가지 좋은 대안이 있습니다. -of-allocating-memory-for-a-typed-memory-view)에 대한 정보를 제공합니다. 최선의 선택은 분명히 상황에 달려 있습니다. – Veedrac

관련 문제