पायथन कोड क्यों संकलित करें?


241

आप पायथन लिपि को क्यों संकलित करेंगे? आप उन्हें सीधे .py फ़ाइल से चला सकते हैं और यह ठीक काम करता है, इसलिए प्रदर्शन लाभ या कुछ और है?

मैं यह भी देखता हूं कि मेरे आवेदन की कुछ फाइलें .pyc में संकलित हो जाती हैं, जबकि अन्य में नहीं होती, ऐसा क्यों है?


आप यह भी नोट कर सकते हैं कि आपके एप्लिकेशन के तेज स्टार्टअप सहित, आप सुरक्षा में भी लाभ प्राप्त करते हैं, यदि आप अपने कोड को साझा नहीं कर सकते हैं यदि यह एक कॉर्पोरेट रहस्य है।
कृपया _Dont_Bully_Me_SO_Lords

@PSyLoCKe आप वास्तव में, वास्तव में नहीं। पायथन बाइटकोड वास्तव में पठनीय है, क्योंकि संकलक को इसे अनुकूलित करने के लिए इसे बाधित करने की आवश्यकता नहीं है। (ऐसा नहीं है कि यह इसका बहुत अनुकूलन करता है ...)
wizzwizz4

1
कारण कुछ फ़ाइलें स्वचालित रूप से संकलित हो जाती हैं क्योंकि वे आयात की जाती हैं; उदाहरण के लिए, यदि आप उपयोग करते हैं import mylib.py, तो पायथन संकलित करेगा mylib.pyताकि भविष्य के importकथन थोड़े तेज़ हों। यदि आप बाद में बदलते हैं mylib.py, तो यह अगली बार आयात होने के बाद फिर से संकलित हो जाएगा (पायथन फ़ाइल तिथि का उपयोग करता है यह देखने के लिए कि ऐसा होता है।)
fyngyrz

जवाबों:


270

यह बाइटकोड द्वारा संकलित किया गया है जिसका उपयोग बहुत, बहुत अधिक, बहुत तेजी से किया जा सकता है।

कुछ फ़ाइलों को संकलित नहीं किए जाने का कारण यह है कि मुख्य स्क्रिप्ट, जिसे आप इनवॉइस करते हैं python main.py, हर बार जब आप स्क्रिप्ट चलाते हैं, तो उसे पुन: कनेक्ट किया जाता है। सभी आयातित लिपियों को संकलित किया जाएगा और डिस्क पर संग्रहीत किया जाएगा।

बेन ब्लैंक द्वारा महत्वपूर्ण अतिरिक्त :

यह ध्यान देने योग्य है कि संकलित स्क्रिप्ट को चलाने के दौरान एक तेज स्टार्टअप समय होता है (क्योंकि इसे संकलित करने की आवश्यकता नहीं है), यह किसी भी तेजी से नहीं चलता है


260
यह ध्यान देने योग्य है कि संकलित स्क्रिप्ट को चलाने के दौरान एक तेज स्टार्टअप समय होता है (क्योंकि इसे संकलित करने की आवश्यकता नहीं है), यह किसी भी तेजी से नहीं चलता है
बेन ब्लैंक

24
एक आम गलतफहमी। साझा करने के लिए धन्यवाद।
Matpie

1
संकलन की आवश्यकता नहीं होने के अलावा, .pyc फ़ाइल लगभग हमेशा छोटी होती है। खासकर अगर आप बहुत कमेंट करते हैं। खदान में से एक 28419 के रूप में .py है, लेकिन केवल 17879 .pyc के रूप में - इसलिए लोड समय भी बेहतर है अंत में, आप शीर्ष स्तर की स्क्रिप्ट को इस तरह से जोड़ सकते हैं: python -m compileall myscript.py
fyngyrz

1
क्या मेमोरी की खपत में कोई अंतर है? मैं केवल 64MB RAM के साथ mips cpu पर आधारित एम्बेडेड उपकरणों पर अजगर का परीक्षण कर रहा हूं, तो क्या पायथन स्क्रिप्ट का संकलित संस्करण शुरू करते समय मेमोरी उपयोग में कोई फायदा है?
वेलेंटाइन

1
@valentt: शायद नहीं। मैं पायथन इंटर्न के बारे में बहुत कुछ नहीं जानता, लेकिन मुझे नहीं लगता कि बायोटेक को पार्स करने से पाइरॉन में बहुत अधिक मेमोरी लगती है। मैं किसी ऐसी चीज के बारे में नहीं सोच सकता जिसे किसी राज्य को याद रखने के लिए बहुत अधिक स्मृति की आवश्यकता हो।
जॉर्ज शॉली

80

.Pyc फ़ाइल पायथन है जिसे पहले ही बाइट-कोड में संकलित किया जा चुका है। पायथन स्वचालित रूप से एक .pyc फ़ाइल चलाता है, अगर वह एक .py फ़ाइल के समान नाम के साथ मिलती है जिसे आप आमंत्रित करते हैं।

"पायथन का एक परिचय" यह संकलित पायथन फ़ाइलों के बारे में कहता है :

जब कोई '.pyc' या '.pyo' फ़ाइल से पढ़ा जाता है, तो कोई प्रोग्राम तेजी से नहीं चलता है, जब वह '.py' फ़ाइल से होता है; एकमात्र चीज़ जो '.pyc' या '.pyo' फ़ाइलों के बारे में तेज़ है, वह गति है जिसके साथ वे लोड किए गए हैं।

एक .pyc फ़ाइल चलाने का लाभ यह है कि पायथन को चलाने से पहले इसे संकलित करने के ओवरहेड को उठाना नहीं पड़ता है। चूंकि पायथन किसी भी तरह से एक .py फ़ाइल चलाने से पहले बाइट-कोड के लिए संकलित करेगा, इससे कोई भी प्रदर्शन सुधार नहीं होना चाहिए।

संकलित .pyc फ़ाइलों के उपयोग से आपको कितना सुधार मिल सकता है? जो स्क्रिप्ट पर निर्भर करता है। एक बहुत ही संक्षिप्त स्क्रिप्ट के लिए जो "हैलो वर्ल्ड" को प्रिंट करता है, संकलन कुल स्टार्टअप और-रन समय का एक बड़ा प्रतिशत बना सकता है। लेकिन कुल रन समय के सापेक्ष एक स्क्रिप्ट को संकलित करने की लागत लंबे समय तक चलने वाली स्क्रिप्ट के लिए कम हो जाती है।

कमांड-लाइन पर आपके द्वारा लिखी गई स्क्रिप्ट कभी भी .pyc फाइल में सेव नहीं होती है। उस "मुख्य" स्क्रिप्ट द्वारा लोड किए गए केवल मॉड्यूल उस तरह से सहेजे जाते हैं।


3
कई मामलों में अंतर देखना मुश्किल है, लेकिन मेरे पास 300,000 से अधिक लाइनों के साथ एक विशेष अजगर फ़ाइल है। (यह परीक्षण के लिए एक अन्य स्क्रिप्ट द्वारा उत्पन्न गणित गणना का एक गुच्छा है) संकलन करने में 37 सेकंड लगते हैं, और निष्पादित करने के लिए केवल 2 सेकंड।
wojtow

54

प्लस:

पहला: सौम्य, हारने योग्य मोटापा।

दूसरा: यदि संकलन काफी छोटी फ़ाइल में परिणाम करता है, तो आपको अधिक लोड समय मिलेगा। वेब के लिए अच्छा है।

तीसरा: पायथन संकलन कदम को छोड़ सकता है। इंटिअल लोड पर तेज़। सीपीयू और वेब के लिए अच्छा है।

चौथा: जितना अधिक आप टिप्पणी करेंगे, उतनी ही छोटी .pycया .pyoफाइल स्रोत .pyफ़ाइल की तुलना में होगी ।

पांचवां: केवल हाथ .pycया .pyoफ़ाइल के साथ एक अंतिम उपयोगकर्ता आपको बग के साथ पेश करने की बहुत कम संभावना है, क्योंकि वे एक अन-उलट बदलाव के कारण होते हैं जो वे आपके बारे में बताना भूल गए थे।

छठा: यदि आप एक एम्बेडेड सिस्टम को लक्ष्य कर रहे हैं, तो एम्बेड करने के लिए एक छोटे आकार की फ़ाइल प्राप्त करना एक महत्वपूर्ण प्लस का प्रतिनिधित्व कर सकता है, और आर्किटेक्चर स्थिर है इसलिए एक विस्तृत, नीचे विस्तृत, खेलने में नहीं आता है।

शीर्ष स्तर का संकलन

यह जानना उपयोगी है कि आप शीर्ष स्तर के पायथन स्रोत फ़ाइल को .pycइस तरह से फ़ाइल में संकलित कर सकते हैं :

python -m py_compile myscript.py

यह टिप्पणियों को हटाता है। यह docstringsबरकरार रहता है। यदि आप इससे भी छुटकारा पाना docstringsचाहते हैं (आप गंभीरता से सोचना चाहते हैं कि आप ऐसा क्यों कर रहे हैं) तो इसके बजाय इस तरह से संकलित करें ...

python -OO -m py_compile myscript.py

... और आपको एक .pyoफ़ाइल के बजाय एक फ़ाइल मिलेगी .pyc; कोड की आवश्यक कार्यक्षमता के संदर्भ में समान रूप से वितरण योग्य, लेकिन छीन-छांट के आकार से छोटा docstrings(और बाद के रोजगार के लिए कम आसानी से समझा जाता है अगर यह docstringsपहले स्थान पर सभ्य था )। लेकिन नीचे तीन देखें।

ध्यान दें कि अजगर .pyफ़ाइल की तारीख का उपयोग करता है , अगर यह मौजूद है, तो यह तय करने के लिए कि क्या इसे .pyफ़ाइल का विरोध करना चाहिए .pycया .pyoफ़ाइल के विपरीत --- तो अपनी .py फ़ाइल को संपादित करें, और .pycया .pyoअप्रचलित है और जो भी लाभ प्राप्त हुए हैं वह खो गए हैं। आपको इसे फिर से प्राप्त करने .pycया .pyoफिर से वापस पाने के लिए इसे फिर से बनाने की आवश्यकता है, जैसे कि वे हो सकते हैं।

कमियां:

पहली: इसमें "मैजिक कुकी" है .pycऔर .pyoफाइलें जो सिस्टम आर्किटेक्चर को इंगित करती हैं कि अजगर फाइल को संकलित किया गया था। यदि आप इनमें से किसी एक फाइल को एक अलग प्रकार के वातावरण में वितरित करते हैं, तो यह टूट जाएगा। आप वितरित हैं .pycया .pyoजुड़े बिना .pyrecompile करने के लिए या touchतो यह प्रतिस्थापित करता है .pycया .pyo, अंत उपयोगकर्ता इसे ठीक नहीं किया जा सकता है, या तो।

दूसरा: यदि ऊपर वर्णित कमांड लाइन विकल्प docstringsके उपयोग के साथ छोड़ दिया जाता -OOहै, तो कोई भी उस जानकारी को प्राप्त करने में सक्षम नहीं होगा, जो कोड का उपयोग अधिक कठिन (या असंभव) कर सकता है।

तीसरा: पायथन का -OOविकल्प -Oकमांड लाइन विकल्प के अनुसार कुछ अनुकूलन को भी लागू करता है; इसके परिणामस्वरूप ऑपरेशन में बदलाव हो सकते हैं। ज्ञात अनुकूलन हैं:

  • sys.flags.optimize = 1
  • assert बयान छोड़ दिए जाते हैं
  • __debug__ = झूठा

चौथा: यदि आपने जानबूझकर अपनी अजगर स्क्रिप्ट #!/usr/bin/pythonको पहली पंक्ति के आदेश पर किसी चीज के साथ निष्पादन योग्य बनाया है , तो यह अंदर .pycऔर .pyoफाइलों में छीन लिया जाता है और यह कार्यक्षमता खो जाती है।

पांचवां: कुछ हद तक स्पष्ट है, लेकिन यदि आप अपना कोड संकलित करते हैं, तो न केवल इसका उपयोग प्रभावित हो सकता है, बल्कि दूसरों के आपके काम से सीखने की क्षमता कम हो जाती है, अक्सर गंभीर रूप से।


10

संकलित अजगर को चलाने में प्रदर्शन में वृद्धि हुई है। हालाँकि जब आप एक आयातित मॉड्यूल के रूप में एक .py फ़ाइल चलाते हैं, तो अजगर इसे संकलित और संग्रहीत करेगा, और जब तक .py फ़ाइल परिवर्तित नहीं होती है यह हमेशा संकलित संस्करण का उपयोग करेगा।

किसी भी इंटरप्टेड भाषा के साथ जब फ़ाइल का उपयोग किया जाता है तो प्रक्रिया कुछ इस तरह दिखाई देती है:
1. फ़ाइल को इंटरपरेटर द्वारा संसाधित किया जाता है।
2. फ़ाइल संकलित है
3. संकलित कोड निष्पादित किया गया है।

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

Heres एक दिलचस्प ब्लॉग पोस्ट जो मतभेदों के बारे में बता रहा है http://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html
और यहाँ एक प्रविष्टि है जो पायथन संकलन प्रक्रिया http://effbot.org/zone बताती है /python-compile.htm


9

जैसा कि पहले ही उल्लेख किया गया है, आप अपने अजगर कोड को बायटेकोड में संकलित करने से एक प्रदर्शन वृद्धि प्राप्त कर सकते हैं। यह आमतौर पर केवल आयातित लिपियों के लिए ही अजगर द्वारा नियंत्रित किया जाता है।

एक और कारण हो सकता है कि आप अपने अजगर कोड को संकलित करना चाहें, अपनी बौद्धिक संपदा को कॉपी और / या संशोधित होने से बचाने के लिए हो सकता है।

आप पायथन प्रलेखन में इसके बारे में अधिक पढ़ सकते हैं ।


2
अपने कोड की सुरक्षा के संबंध में - संकलन करने से पूरी मदद नहीं मिलेगी। संकलित obfuscates - लेकिन इच्छा के साथ किसी को आपके कोड की परवाह किए बिना मिल जाएगा।
जोश स्मेटन

1
@ जोश हमेशा संभव होता है, यदि कोई मेमोरी तक पहुंच सकता है या पर्याप्त समय के साथ सीपीयू को निर्देश देख सकता है और क्या वे आपके ऐप का निर्माण कर सकते हैं।
UnwwnTech

5
हालांकि, जैसा कि Unkwntech ने कहा है, यह हमेशा संभव होगा, अगर व्यक्ति पर्याप्त रूप से निर्धारित हो। लेकिन मुझे विश्वास है कि यह ज्यादातर स्थितियों में पर्याप्त होगा, जहां आप आमतौर पर लोगों को "कोड" को ठीक करने से रोकना चाहते हैं ...
साइमन बी। जेनसेन

बोली कि बाईटकोड को संकलित किया गया है आम तौर पर सभी नहीं कर रहे हैं कि करने के लिए कठिन रिवर्स संकलन जब तक आप उन्हें अंधेरा करना अतिरिक्त कदम उठाने के लिए - केवल आम तौर पर संकलन पर्याप्त नहीं होगा।
EJoshuaS -

7

संकलित स्क्रिप्ट को चलाते समय निश्चित रूप से एक प्रदर्शन अंतर होता है। यदि आप सामान्य .pyस्क्रिप्ट चलाते हैं, तो मशीन इसे चलाने पर हर बार संकलित करती है और इसमें समय लगता है। आधुनिक मशीनों पर यह शायद ही ध्यान देने योग्य है लेकिन जैसे-जैसे पटकथा बढ़ती है यह एक मुद्दा बन सकता है।


7

कुछ नहीं छुआ स्रोत-से-स्रोत-संकलन है । उदाहरण के लिए, nuitkaपायथन कोड को C / C ++ में अनुवाद करता है, और बाइनरी कोड के लिए इसे संकलित करता है, जो कि सीधे CPU पर चलता है, बजाय Python bytecode के जो धीमी वर्चुअल मशीन पर चलता है।

इससे महत्वपूर्ण स्पीडअप हो सकते हैं, या यह आपको पायथन के साथ काम करने देगा, जबकि आपका वातावरण C / C ++ कोड पर निर्भर करता है।


4

हम उन उपयोगकर्ताओं को वितरित करने के लिए संकलित कोड का उपयोग करते हैं जिनके पास स्रोत कोड तक पहुंच नहीं है। मूल रूप से अनुभवहीन प्रोग्रामर्स को गलती से रोकने के लिए या हमें बताए बिना कुछ को बदलने या बग को ठीक करने के लिए।


2

हां, प्रदर्शन मुख्य कारण है और जहां तक ​​मुझे पता है, एकमात्र कारण है।

यदि आपकी कुछ फाइलें संकलित नहीं हो रही हैं, तो शायद पायथन, .pyc फाइल को लिखने में सक्षम नहीं है, शायद निर्देशिका अनुमतियों या कुछ और के कारण। या शायद अनकही फ़ाइलें अभी लोड नहीं हो रही हैं ... (स्क्रिप्ट / मॉड्यूल केवल तभी संकलित हो जाते हैं जब वे पहली बार लोड होते हैं)


1

शुरुआती मान लेते हैं कि पाइकॉन को .pyc फ़ाइलों के कारण संकलित किया गया है। .Pyc फ़ाइल संकलित बायटेकोड है, जिसकी व्याख्या तब की जाती है। इसलिए यदि आपने अपना पायथन कोड पहले चला लिया है और .pyc फ़ाइल काम में है, तो यह दूसरी बार तेजी से चलेगा, क्योंकि इसके लिए बायटेकोड को फिर से संकलित नहीं करना पड़ता है

संकलक: एक संकलक कोड का एक टुकड़ा है जो उच्च स्तरीय भाषा को मशीन भाषा में अनुवाद करता है

दुभाषिए: दुभाषिए उच्च स्तरीय भाषा को मशीन पठनीय बाइनरी समकक्ष में भी परिवर्तित करते हैं। हर बार जब एक दुभाषिया को उच्च स्तरीय भाषा कोड निष्पादित किया जाता है, तो यह मशीन कोड में बदलने से पहले कोड को एक मध्यवर्ती कोड में बदल देता है। कोड के प्रत्येक भाग की व्याख्या की जाती है और फिर एक अनुक्रम में अलग से निष्पादित किया जाता है और कोड के एक हिस्से में एक त्रुटि पाई जाती है यह कोड के अगले सेट का अनुवाद किए बिना कोड की व्याख्या को रोक देगा।

सूत्रों का कहना है: http://www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter


9
"संकलक" की आपकी परिभाषा गलत है। मशीन कोड को संकलित करने के लिए एक संकलक कभी नहीं किया गया है। एक संकलक एक भाषा से दूसरी भाषा में अनुवादक मात्र है। यही कारण है कि हम कहते हैं कि पायथन बाइटकोड को "संकलन" करता है, कॉफ़ीसस्क्रिप्ट जावास्क्रिप्ट को "संकलन" करता है, और इसी तरह आगे भी।
रिकी स्टीवर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.