2011-12-05 19 views
33

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

+8

मैंने लगभग चार साल बाद गलती से एक अध्याय को सह-लेखन करके जवाब दिया जिसमें जनरेटर और कोरआउट को लागू करने के बारे में एक स्पष्टीकरण शामिल है: http://aosabook.org/en/500L/a-web-crawler-with-asyncio -coroutines.html –

+0

ग्रेट आलेख, बहुत घना। –

+0

असंबद्ध, लेकिन ... इस विषय पर ग्विडो के साथ एक पुस्तक अध्याय लिखने के लिए जेनरेटर को कैसे लागू किया जाता है, इस बारे में पूछने से 4 साल से कम समय में आप कैसे प्राप्त हुए? :) – max

उत्तर

14

yield निर्देश वर्तमान निष्पादन संदर्भ को बंद करने के रूप में लेता है, और इसे अपने स्वयं के जीवित वस्तु में बदल देता है। इस ऑब्जेक्ट में __iter__ विधि है जो इस उपज कथन के बाद जारी रहेगी।

तो कॉल स्टैक एक ढेर ऑब्जेक्ट में परिवर्तित हो जाता है।

+3

सी "हार्डवेयर" ढेर को स्पष्ट करना महत्वपूर्ण है और पाइथन स्टैक पूरी तरह से अलग चीजें हैं, क्योंकि सवाल दोनों को भ्रमित करता है। मेरा जवाब यह स्पष्ट करता है। (@Rudi - आप जवाब ठीक है, मैं टिप्पणी छोड़ रहा हूं ताकि अन्य लोग यहां आने वाले हिस्से को भी देख सकें) – jsbueno

37

धारणा है कि एक पाइथन प्रोग्राम में पाइथन का ढेर और सी ढेर इंटरमीस्ड भ्रामक हो सकता है।

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

जेनरेटर और इटरेटर्स का उपयोग करते समय, दुभाषिया पाइथन प्रोग्राम स्टैक की तुलना में कहीं और संबंधित फ्रेम ऑब्जेक्ट को स्टोर करता है, और जनरेटर के निष्पादन के निष्पादन के दौरान इसे वापस धक्का देता है। यह "कहीं और" जनरेटर ऑब्जेक्ट ही है। जेनरेटर ऑब्जेक्ट पर "अगली" या "भेजें" विधि को कॉल करने से ऐसा होता है।

+1

यह तकनीकी उत्तर है जो मैं स्टैक ओवरव्लो में और देखना चाहता हूं। धन्यवाद! – glendon

+2

मैंने इसे पढ़ने के बाद इसे देखा, इसलिए अगर कोई और दिलचस्पी लेता है, तो यहां [जेनरेटर के सीपीथॉन कार्यान्वयन] (https://github.com/python/cpython/blob/master/Objects/genobject.c) है। मैं पहले इस जवाब को पढ़ने की सलाह देता हूं, यह समझने में मदद करता है कि कोड क्या करता है। – spectras

-2

कुछ मौजूदा उत्तरों और टिप्पणियों का दावा है कि पायथन एक "प्रोग्राम स्टैक" बनाए रखता है जो पूरी तरह से वीएम के सी स्टैक से अलग होता है। यह दावा गलत है।

चेक लिंक: http://en.wikipedia.org/wiki/Stackless_Python

stackless अजगर मौजूद है, लेकिन मुख्य धारा नहीं है। समझ यह है कि सवाल सही है।

संबंधित मुद्दे