documentation는 직교 제품 기능파이썬의 itertools 제품 메모리 소비
the actual implementation does not build up intermediate results in memory.
어떻게 그 발전기 가능이 될 수 있다고? 누군가 제 2 발전기에 대한 제한된 메모리 소비량을 가진 예제를 보여줄 수 있습니까?
documentation는 직교 제품 기능파이썬의 itertools 제품 메모리 소비
the actual implementation does not build up intermediate results in memory.
어떻게 그 발전기 가능이 될 수 있다고? 누군가 제 2 발전기에 대한 제한된 메모리 소비량을 가진 예제를 보여줄 수 있습니까?
은 모듈의 소스 코드를 보면, itertools.product()
실제로 튜플에 모든 인수를 변환 : 즉
// product_new() in itertoolsmodule.c
for (i=0; i < nargs ; ++i) {
PyObject *item = PyTuple_GET_ITEM(args, i);
PyObject *pool = PySequence_Tuple(item); //<==== Call tuple(arg)
if (pool == NULL)
goto error;
PyTuple_SET_ITEM(pools, i, pool);
indices[i] = 0;
}
는 itertools.product()
의 메모리 소비는 입력 인수의 크기에 선형 것으로 보인다.
글쎄, 그것은 또한 말한다 : 모든 반복에 진출 맨 오른쪽 요소 와 주행 거리계 같은
중첩 루프주기. 이 패턴은 사전 식 순서를 작성하여 입력의 iterables가 정렬 된 경우 제품 튜플이 정렬 된 순서로 내보내 지도록합니다.
이 거의 그것을 구현에서 작동하는 방법이다 (Modules/itertoolsmodule.c
)
는 상태 객체입니다
typedef struct {
PyObject_HEAD
PyObject *pools; /* tuple of pool tuples */
Py_ssize_t *indices; /* one index per pool */
PyObject *result; /* most recently returned result tuple */
int stopped; /* set to 1 when the product iterator is exhausted */
} productobject;
그리고 다음 항목이 사용하는 기능 product_next
에 의해 반환 상태 및 알고리즘을 사용하여 다음 상태를 생성합니다. 메모리 요구 사항을 이해하려면 this answer을 참조하십시오.
일반 교육의 경우 C 확장자 here의 상태로 생성자를 만드는 방법을 읽을 수 있습니다.
[itertools.product를 사용하여 MemoryError를 가져 오는 이유는 무엇입니까?] (http://stackoverflow.com/q/8695422/222914) –