एक विशाल स्ट्रिंग से अक्षर निकालने की समस्या पर विचार करें।तारों में शामिल हों। जनरेटर या सूची समझ?
एक तरह से करने के लिए
''.join([c for c in hugestring if c.isalpha()])
है तंत्र स्पष्ट है: सूची समझ वर्णों की एक सूची उत्पन्न करता है। जॉइन विधि जानता है कि सूची की लंबाई तक पहुंचने में कितने पात्रों को शामिल करने की आवश्यकता है। ऐसा करने के लिए
अन्य तरीका
''.join(c for c in hugestring if c.isalpha())
यहाँ एक जनरेटर में जनरेटर समझ परिणाम है। जॉइन विधि यह नहीं जानता कि यह कितने पात्रों में शामिल होने जा रहा है क्योंकि जनरेटर के पास लेन विशेषता नहीं है। इसलिए शामिल होने का यह तरीका सूची समझ विधि से धीमा होना चाहिए।
लेकिन पायथन में परीक्षण से पता चलता है कि यह धीमा नहीं है। ऐसा क्यों है? कोई भी बता सकता है कि जेनरेटर पर कैसे काम करता है।
स्पष्ट है:
sum(j for j in range(100))
क्योंकि यह संचयी योग का ट्रैक रख सकते 100 में से किसी ज्ञान की आवश्यकता नहीं है। यह जेनरेटर पर अगली विधि का उपयोग करके अगले तत्व तक पहुंच सकता है और फिर संचयी योग में जोड़ सकता है। हालांकि, चूंकि तार अपरिवर्तनीय हैं, तारों को संचयी रूप से जोड़ना प्रत्येक पुनरावृत्ति में एक नई स्ट्रिंग बनाएगा। तो इसमें बहुत समय लगेगा।
तो गति ओपी नोटिस में अंतर पूरी तरह परिस्थिति में होना चाहिए, है ना? –
@ Ev.Kounis: प्रश्नकर्ता ने कहा कि दो संस्करण गति में समान थे ("** ** ** धीमा नहीं"), जो समझ में आता है कि वे 'जॉइन' द्वारा लिया गया समय और सूची समझ से लिया गया समय दोनों को माप रहे थे साथ में। यदि आपने केवल 'join' को मापा है, तो जेनरेटर अभिव्यक्ति संस्करण धीमा हो जाएगा क्योंकि इसे किसी भी स्ट्रिंग में शामिल होने से पहले पूरे जेनरेटर को किसी सूची में डंप करना होगा। इसमें दूसरी समझ में सूची समझ के निर्माण के रूप में उतना ही समय लगेगा। – Blckknght