2012-05-23 3 views
13

documentation는 직교 제품 기능파이썬의 itertools 제품 메모리 소비

the actual implementation does not build up intermediate results in memory. 

어떻게 그 발전기 가능이 될 수 있다고? 누군가 제 2 발전기에 대한 제한된 메모리 소비량을 가진 예제를 보여줄 수 있습니까?

+3

[itertools.product를 사용하여 MemoryError를 가져 오는 이유는 무엇입니까?] (http://stackoverflow.com/q/8695422/222914) –

답변

9

은 모듈의 소스 코드를 보면, 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()의 메모리 소비는 입력 인수의 크기에 선형 것으로 보인다.

4

글쎄, 그것은 또한 말한다 : 모든 반복에 진출 맨 오른쪽 요소 와 주행 거리계 같은

중첩 루프주기. 이 패턴은 사전 식 순서를 작성하여 입력의 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의 상태로 생성자를 만드는 방법을 읽을 수 있습니다.