2014-11-10 7 views
4

나는 현재 내 사이 썬 pyx 파일에 내 MemoryView의 설정 해요 :초기화 사이 썬 Memoryview 효율적으로

내가 cdef int[:] x = np.empty(10) 쇼 어둠 속에서 결과 주석 html 파일에 cython -a foo.pyx로 라인을 pyx 파일을 컴파일
@cython.boundscheck(False) 
cdef int[:] fill_memview(): 
    # This happens inside a big loop so needs to be fast 
    cdef int[:] x = np.empty(10) 
    for i in range(10): 
     x[i] = i 
    return x 

cdef stupid_loop(): 
    for i in range(10000): 
     fill_memview() 

노란색 (많은 Python이 느려지는 것을 의미합니다.)

어떻게하면 입력 된 Memoryview를 더 잘 구현할 수 있습니까?

답변

3

메모리를 할당하는 다양한 방법을 비교하려면 this answer을 참조하십시오. 귀하의 요구가 간단하다면 (단지 인덱싱) 'cpython.array 원시 C 타입'에 특히주의를 기울이면 신속한 생성을 위해 cpython 배열을 생성하여 빠른 안전하지 않은 색인을 위해 as_ints[i]을 사용하거나 실제로 메모리보기가 필요한 경우 cpython 배열의 메모리보기는 numpy 배열보다 3 배 빠릅니다.

코드에 대한 더 큰 그림없이 더 구체적인 조언을 제공하는 것이 어렵습니다. 예를 들어 가능한 한 많은 2 차원 배열을 사용하는 것이 더 좋을 것입니다. 작은 배열을 많이 사용하는 것보다 하나의 큰 메모리를 할당하는 것이 더 효율적이기 때문입니다. 예를 들어 작은 메모리 조각을 많이 만들면 훨씬 더 빠릅니다 할당 된 메모리의 큰 덩어리와 함께 하나의 큰 메모리보기의, 할당 된 메모리의 작은 조각으로 각각 작은 메모리보기의 무리를 만드는 것보다.

1

파이썬에서 참조 횟수를 계산해야하기 때문에 memoryview가 느립니다 (꼭 필요한 것 이상). Python/C API를 사용하여 allocate the memory by hand을 사용할 수 있지만 더 이상 필요하지 않을 때 해제해야합니다.

프로필러를 사용하고 받아 들일 수없는 양의 참조 오버 헤드가 발생하지 않는 한이 작업을 수행하지 마십시오. 조숙 한 최적화는 결코 좋은 생각이 아니며이 방법으로 메모리 누수 또는 segfaults를 쉽게 도입 할 수 있습니다.

+0

"조기 최적화"의 의미를 설명 할 수 있습니까? – LondonRob

+0

코드를 빨리 작성하려고하지만 프로파일 러를 사용하여 성능을 측정 할 때까지는이 코드를 실행하는 데 많은 시간을 소비하고 있다는 것을 모릅니다. 사실 빡빡한 루프가 발생한다는 사실은 경험적 데이터가 없어도 확신 할 수 없음을 의미합니다. 아마도 O (1) 파이썬 오버 헤드는 O (n) 초기화 (즉'x [i] = i' 라인)에 의해 지배 될 것입니다. – Kevin