2012-05-23 39 views
13

documentation का कहना है कि कार्तीय उत्पाद समारोहपायथन के itertools उत्पाद स्मृति खपत

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

कैसे है कि जनरेटर के साथ संभव हो सकता है? क्या कोई मुझे 2 जनरेटर के लिए बाध्य स्मृति खपत के साथ उदाहरण दिखा सकता है?

+3

संभावित डुप्लिकेट [मुझे itertools.product के साथ मेमोरी एरर क्यों मिलता है?] (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

खैर, यह भी कहते हैं:

सबसे दायीं ओर का तत्व हर यात्रा पर आगे बढ़ के साथ एक ओडोमीटर तरह नेस्टेड छोरों चक्र। यह पैटर्न एक लेक्सिकोग्राफिक ऑर्डरिंग बनाता है ताकि अगर इनपुट के पुनरावृत्तियों को क्रमबद्ध किया गया हो, तो उत्पाद टुपल्स क्रमबद्ध क्रम में उत्सर्जित होते हैं।

यह काफी है कि यह कैसे लागू करने में काम करता है (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 देखें।

सामान्य शिक्षा के लिए, आप सी एक्सटेंशन here से राज्य के साथ जेनरेटर बनाने के तरीके के बारे में पढ़ सकते हैं।