2010-08-06 2 views
5

플롯 (plot) 코드의 기본 구조 (matplotlib)를 타이머에 업데이트하여 플롯 데이터에 대한 파이썬 목록을 사용하여 numpy 배열을 사용하도록 변경하려고합니다. 가능한 한 줄거리의 시간 단계를 낮출 수 있기를 원하며, 데이터가 수천 개의 점으로 나타날 수 있기 때문에, 내가 할 수 없다면 나는 귀중한 시간을 빨리 잃어 버리게됩니다. 나는 이런 종류의 배열에 numpy 배열을 선호하지만 Python 프로그래머처럼 생각해야 할 때와 C++ 프로그래머가 메모리 액세스의 효율성을 최대화 할 필요가있을 때 생각할 때 문제가 있습니다.numpy 배열을 사용하는 파이썬 가비지 수집은 어떻게 추가되고 삭제됩니까?

append() 함수에 대한 scipy.org 문서에 첨부 된 복사본의 복사본을 반환한다고 나와 있습니다. 이 모든 사본이 제대로 가비지 수집됩니까? 예를 들어 :

import numpy as np 

a = np.arange(10) 
a = np.append(a,10) 
print a

이것은 ++은 C에 무슨 일이 일어나고 있는지의 내 독서이다 - 수준,하지만 난, 내가 질문을되지 않을 것에 대해 말하고 있었는지 알았다면, 그렇다면 제발 올바른 I 잘못 했어! = P

먼저 10 개의 정수 블록이 할당되고 기호 a는 해당 블록의 시작을 나타냅니다. 그런 다음 총 11 개의 정수 (84 바이트)가 사용되기 때문에 11 개의 정수로 이루어진 새로운 블록이 할당됩니다. 그런 다음 포인터는 11-int 블록의 시작 부분으로 이동합니다. 내 생각에 이것은 가비지 콜렉션 알고리즘이 10-int 블록의 참조 카운트를 0으로 감소시키고 그것을 할당 해제하게 될 것입니다. 이게 옳은 거니? 그렇지 않은 경우 추가시 오버 헤드가 발생하지 않도록하려면 어떻게해야합니까?

numpy 배열을 올바르게 사용하는 방법을 잘 모르겠습니다. 플롯에서 모든 데이터를 플러시하고 다시 시작하는 재설정 버튼이 있습니다. 목록이있을 때 del data[:]을 사용하여이 작업을 수행했습니다. numpy 배열에 해당하는 함수가 있습니까? 아니면 data = np.array ([])라고 말하고 가비지 컬렉터를 사용하여 작업을 수행해야합니까?

답변

10

자동 메모리 관리의 요점은 당신이 그것에 대해 생각하지 않는다는 것입니다. 여러분이 작성한 코드에서 사본은 가비지 수집이 잘 될 것입니다 (파이썬의 메모리 관리를 혼란스럽게하는 것은 불가능합니다). 그러나 np.append이 배치되어 있지 않으므로 코드는 메모리에 새로운 배열 (연결을 포함하여 a10)을 만들고 변수 a이이 새 배열을 가리 키도록 업데이트됩니다. a은 더 이상 refcount가 1이었던 원래 배열을 더 이상 가리키지 않기 때문에 refcount가 0으로 감소되고 자동으로 정리됩니다. gc.collect을 사용하여 강제 완전히 정리할 수 있습니다.

최적화가 가능하지만 파이썬의 힘은 미세 조정 메모리 액세스에 있지 않습니다. 아마 a (예 : a = np.zeros(<size>) 등)을 미리 할당하는 것이 가장 좋습니다. 그것보다 미세 조정이 필요하다면 약간 털이 나기 시작합니다. 당신은 Cython + Numpy tutorial을보고 효율성을 위해 C와 Python을 통합하는 매우 깔끔하고 쉬운 방법을 찾아 볼 수 있습니다.

파이썬의 변수는 내용이 저장된 위치를 가리 킵니다. del 변수를 사용할 수 있으며 대상의 참조 횟수를 1 줄입니다. 참조 횟수가 0이되면 대상은 자동으로 정리됩니다. 이것의 도덕은 당신의 기억을 정리하는 것에 대해 걱정하지 마십시오. 자동으로 실행됩니다.

+0

그래서 기본적으로 나는 진정해야합니다. =) 명확한 설명 주셔서 감사합니다. 어떻게 작동했는지는 알았지 만 100 % 명확하지 않았습니다. – pr0crastin8r

관련 문제