2009-06-07 12 views
9

के लिए इसका उपयोग नहीं करना चाहिए, बस पाइथन जेनरेटर को देखकर, उनके साथ वास्तविक प्रभाव, लेकिन क्या कोई चीज उनको उपयोग नहीं कर रही है? मैं पिछले सी कोडिंग के बारे में सोच रहा था जहां फ़ाइल से पढ़ना, या उपयोगकर्ता क्रियाएं क्षेत्र होंगी। उदाहरण के लिए, जनरेटर को उपयोगकर्ता को इनपुट (बेस डेटा एंट्री?) और इनपुट कॉलिंग फ़ंक्शन प्रक्रिया के लिए संकेत देने के लिए उपयोग किया जा सकता है? क्या कोई प्रदर्शन या सफाई समस्याएं चिंतित हैं?पायथन जेनरेटर -

उत्तर

12

एक जनरेटर के साथ समस्या यह है कि वे मिलता है "का सेवन किया।" इसका अर्थ यह है कि यदि आपको अनुक्रम पर पुन: पुन: प्रयास करने की आवश्यकता है, तो आपको जनरेटर को दोबारा बनाने की आवश्यकता है।

यदि आलसी मूल्यांकन एक मुद्दा है, तो आप शायद जनरेटर अभिव्यक्ति नहीं चाहते हैं। उदाहरण के लिए, यदि आप अपनी सभी गणनाओं को सामने करना चाहते हैं (उदा। ताकि आप संसाधन जारी कर सकें), तो एक सूची समझ या लूप के लिए शायद सबसे अच्छा है।

यदि आप psyco का उपयोग करते हैं, तो आपको सूची अभिव्यक्तियों और लूप के लिए महत्वपूर्ण गति वृद्धि मिलेगी, लेकिन जेनरेटर के लिए नहीं।

इसके अलावा, अगर आपको अपने अनुक्रम की लंबाई आगे बढ़ने की आवश्यकता है, तो आप जनरेटर नहीं चाहते हैं।

13

जनरेटर अच्छी तरह से जारी नहीं रहते हैं।

आम तौर पर, आपको जनरेटर ऑब्जेक्ट को जारी रखने का प्रयास करने में त्रुटि होती है।

>>> def generatorForEvenKeys(aDictionary): 
    for k in aDictionary: 
     if k % 2 == 0: yield aDictionary[k] 

>>> x = generatorForEvenKeys(someDictionary) 
>>> pickle.dump(x,file('temp.dat','wb')) 

आपको निम्न त्रुटि हो जाता है:

TypeError: can't pickle generator objects 
+0

+1 अच्छा पता करने के लिए – ebo

+0

आपको एक उदाहरण दे सकते हैं? – bayer

+0

बेयर: निम्नानुसार उदाहरण: मैं एक टेक्स्ट दस्तावेज़ और पुन: शब्दों को वापस कर रहा हूं। मैं जनरेटर को चुनना चाहता हूं ताकि मैं टेक्स्ट दस्तावेज़ को ठीक से कहां पढ़ूं जहां से मैंने छोड़ा था। ऊप्स! नहीं कर सकते। क्या एक पिटा है। –

1

आप एक जनरेटर का उपयोग करके ऐसी जब आप की जरूरत है (क्यों xrange पायथन 2.x में range और कम की तुलना में बहुत लंबे समय तक दृश्यों का समर्थन करता है यह है) कुछ, iterateable हो स्मृति में पूरी सूची पकड़े बिना के लिए

चाहते मेमोरी में पूरी तरह से "उपज करने के लिए सामान की सूची" लोड करने के लिए, जेनरेटर का उपयोग करने में बहुत कुछ नहीं है - आप एक सूची भी वापस कर सकते हैं।

एक (थोड़ा काल्पनिक) उदाहरण के लिए:

def my_pointless_generator(x): 
    thedata = range(x) # or thedata = list(range(x)) in Python 3.x 
    for x in thedata: 
     yield x 

बस के रूप में कुशलतापूर्वक के रूप में लिखा जा ..can ..

def my_pointless_generator(x): 
    return range(x) 
संबंधित मुद्दे