दिलचस्प पोस्ट
स्टोर खोलने के लिए इस्तेमाल किया जाने वाला मॉडल स्टोर बनाने के लिए इस्तेमाल किए जाने वाले किसी के साथ असंगत है स्पार्क सीरियललाइज़ेशन को समझना स्पष्ट आइकन के साथ IE10 पर पाठ इनपुट को साफ़ करते समय ईवेंट निकाल दिया गया IPhone वितरण प्रमाणपत्र के लिए निजी कुंजी खोई गई क्या समाधान हो सकता है? प्रतिलिपि / पेस्ट घटना श्रोता में सी # एक PostgreSQL फ़ंक्शन पैरामीटर के रूप में तालिका का नाम महत्त्वपूर्ण अंकों की एक मनमाना संख्या में गोल करना रूबी में एक पृष्ठभूमि की प्रक्रिया पैदा करें VueJS: क्यों "यह" अपरिभाषित है? IE8 में टूटी गई जेड-इंडेक्स? अपूर्णांक रखने के लिए स्ट्रिंग को दशमलव में कनवर्ट करें सही-संरेखित फ्लेक्स आइटम? फ़ंक्शन को टेम्पलेट तर्क के रूप में पारित किया गया एंड्रॉइड: कैमरे का उपयोग करते हुए फोन के परिवेश में चमक (प्रकाश की मात्रा) का पता लगाता है? स्ट्रिंग के सभी ऊपरी, निचले और मिश्रित केस संयोजनों को ढूंढें

जब अजगर जेनरेटर का उपयोग करने का अच्छा समय नहीं है?

यह इसके बजाय व्युत्क्रम है क्या आप पायथन जनरेटर कार्यों का उपयोग कर सकते हैं? : अजगर जेनरेटर, जेनरेटर एक्सप्रेशंस, और itertools मॉड्यूल इन दिनों के कुछ अजगर मेरे पसंदीदा फीचर्स हैं। वे डेटा के बड़े ढेर पर प्रदर्शन करने के लिए संचालन की श्रृंखला को स्थापित करते समय विशेष रूप से उपयोगी होते हैं – मैं अक्सर उन्हें DSV फ़ाइलों की प्रोसेसिंग करते समय उपयोग करता हूं

तो जब यह जनरेटर, या जनरेटर अभिव्यक्ति या itertools का उपयोग करने का एक अच्छा समय नहीं है?

  • मुझे जब itertools.izip() पर zip() पसंद करना चाहिए, या
  • range() xrange() , या
  • [x for x in foo] ओवर (x for x in foo) ?

जाहिर है, हमें अंततः एक जनरेटर को वास्तविक डेटा में "हल" करने की ज़रूरत है, आम तौर पर एक सूची बनाकर या गैर-जनरेटर लूप के साथ इसे चलाने पर। कभी-कभी हमें सिर्फ लंबाई जानने की ज़रूरत है यह वही नहीं है जो मैं पूछ रहा हूं।

हम जनरेटर का उपयोग करते हैं ताकि हम अंतरिम डेटा के लिए नई सूचियों को स्मृति में निर्दिष्ट नहीं कर रहे हों। यह विशेष रूप से बड़े डेटासेट के लिए समझ में आता है। क्या यह छोटे डेटासेट के लिए भी समझ में आता है? क्या एक मेमोरी / सीपीयू व्यापार बंद है?

मुझे विशेष रूप से दिलचस्पी है अगर किसी ने इस पर कुछ प्रोफाइलिंग की है, तो सूची की स्पष्टता प्रदर्शन बनाम नक्शा () और फ़िल्टर () के आंख खोलने की चर्चा के प्रकाश में। ( alt लिंक )

Solutions Collecting From Web of "जब अजगर जेनरेटर का उपयोग करने का अच्छा समय नहीं है?"

जनरेटर के बजाय एक सूची का उपयोग करें, जब:

1) आपको कई बार डेटा तक पहुंचने की ज़रूरत है (यानी उनको पुन: कंप्यूटिंग के बजाय कैश परिणाम):

 for i in outer: # used once, okay to be a generator or return a list for j in inner: # used multiple times, reusing a list is better ... 

2) आपको यादृच्छिक अभिगम (या आगे अनुक्रमिक आदेश के अलावा अन्य किसी भी एक्सेस की आवश्यकता है):

 for i in reversed(data): ... # generators aren't reversible s[i], s[j] = s[j], s[i] # generators aren't indexable 

3) आपको स्ट्रिंग्स में शामिल होने की ज़रूरत है (डेटा पर दो पास की आवश्यकता होती है):

 s = ''.join(data) # lists are faster than generators in this use case 

4) आप PyPy का उपयोग कर रहे हैं जो कभी-कभी जनरेटर कोड का अनुकूलन नहीं कर सकता जितना यह सामान्य फ़ंक्शन कॉल और सूची जोड़तोड़ के साथ कर सकता है।

सामान्य तौर पर, जब आप सूची संचालन की ज़रूरत होती है, जैसे कि लेन (), उलट (), और इसी तरह, जनरेटर का उपयोग न करें।

ऐसे समय भी हो सकते हैं जब आप आलसी मूल्यांकन नहीं करना चाहते (जैसे कि सभी गणना को सामने रखना ताकि आप किसी संसाधन को जारी कर सकें)। उस स्थिति में, एक सूची अभिव्यक्ति बेहतर हो सकती है

प्रोफ़ाइल, प्रोफ़ाइल, प्रोफ़ाइल

आपके कोड को प्रोफाइल करने का यह एकमात्र तरीका है कि आप क्या कर रहे हैं, इसका कोई भी प्रभाव पड़ता है।

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

प्रोफ़ाइल, प्रोफ़ाइल, प्रोफ़ाइल

आपको izip पर zip , xrange पर range , या जनरेटर की xrange पर xrange izip को कभी भी पसंद नहीं करना चाहिए। पायथन 3.0 range में xrange -जैसे शब्दों और zip पास izipizip semantics है।

सूची की list(frob(x) for x in foo) वास्तव में स्पष्ट रूप से list(frob(x) for x in foo) तरह स्पष्ट होती हैं list(frob(x) for x in foo)

जैसा कि आप कहते हैं, "यह विशेष रूप से बड़ी डेटासेट्स के लिए समझ में आता है", मुझे लगता है कि यह आपके प्रश्न का उत्तर देता है

यदि आप किसी भी दीवारों को नहीं मारते हैं, तो प्रदर्शन-वार, मैं सूचियों और मानक कार्यों में रहूँगा तब जब आप प्रदर्शन के साथ समस्याओं में चलते हैं तो स्विच करें।

प्रदर्शन के बारे में: यदि psyco का उपयोग करना है, तो सूची जनरेटर की तुलना में काफी तेज हो सकती है। नीचे दिए गए उदाहरण में, psyco.full () का उपयोग करते समय सूचियां लगभग 50% तेज हो जाती हैं

 import psyco import time import cStringIO def time_func(func): """The amount of time it requires func to run""" start = time.clock() func() return time.clock() - start def fizzbuzz(num): """That algorithm we all know and love""" if not num % 3 and not num % 5: return "%d fizz buzz" % num elif not num % 3: return "%d fizz" % num elif not num % 5: return "%d buzz" % num return None def with_list(num): """Try getting fizzbuzz with a list comprehension and range""" out = cStringIO.StringIO() for fibby in [fizzbuzz(x) for x in range(1, num) if fizzbuzz(x)]: print >> out, fibby return out.getvalue() def with_genx(num): """Try getting fizzbuzz with generator expression and xrange""" out = cStringIO.StringIO() for fibby in (fizzbuzz(x) for x in xrange(1, num) if fizzbuzz(x)): print >> out, fibby return out.getvalue() def main(): """ Test speed of generator expressions versus list comprehensions, with and without psyco. """ #our variables nums = [10000, 100000] funcs = [with_list, with_genx] # try without psyco 1st print "without psyco" for num in nums: print " number:", num for func in funcs: print func.__name__, time_func(lambda : func(num)), "seconds" print # now with psyco print "with psyco" psyco.full() for num in nums: print " number:", num for func in funcs: print func.__name__, time_func(lambda : func(num)), "seconds" print if __name__ == "__main__": main() 

परिणाम:

 without psyco number: 10000 with_list 0.0519102208309 seconds with_genx 0.0535933367509 seconds number: 100000 with_list 0.542204280744 seconds with_genx 0.557837353115 seconds with psyco number: 10000 with_list 0.0286369007033 seconds with_genx 0.0513424889137 seconds number: 100000 with_list 0.335414877839 seconds with_genx 0.580363490491 seconds 

जहां तक ​​प्रदर्शन का संबंध है, मैं किसी भी समय नहीं सोच सकता कि आप किसी जनरेटर पर एक सूची का उपयोग करना चाहते हैं।

मैंने कभी ऐसी कोई स्थिति नहीं देखी है, जहां जनरेटर आपको क्या करने की कोशिश कर रहे हैं। हालांकि, बहुत सारे उदाहरण हैं, जहां जनरेटर का उपयोग करने से आप उनका उपयोग न करने से ज्यादा मदद नहीं करेंगे।

उदाहरण के लिए:

 sorted(xrange(5)) 

किसी भी सुधार की पेशकश नहीं करता है:

 sorted(range(5)) 

यदि आप बाद में कुछ और के लिए मूल्यों को बनाए रखने की आवश्यकता है और आपके सेट का आकार बहुत बड़ा नहीं है, तो आपको सूची की समझ को पसंद करना चाहिए।

उदाहरण के लिए: आप एक सूची बना रहे हैं जो आप अपने कार्यक्रम में कई बार बाद में लूप करेंगे।

कुछ हद तक आप जनरेटरों को पुनरावृत्ति (लूप) के लिए प्रतिस्थापन के रूप में सोच सकते हैं। डेटा संरचना प्रारंभिक प्रकार के एक प्रकार के रूप में सूची की समझें। यदि आप डेटा संरचना रखना चाहते हैं तो सूची की गणना का उपयोग करें।