पाइथन बनाम सिफथॉन


447

अजगर और CPyon (Jython, IronPython) के बारे में यह सब उपद्रव है , मुझे यह नहीं सूझा :

python.org का उल्लेख है कि CPython है:

पायथन के "पारंपरिक" कार्यान्वयन (उपनाम CPython)

अभी तक एक और ढेर अतिप्रवाह सवाल का उल्लेख है कि:

CPython Python का डिफ़ॉल्ट बाइट-कोड दुभाषिया है, जो C में लिखा गया है।

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

तो वास्तव में सीपीथॉन क्या है और अजगर के साथ तुलना करने पर यह कैसे भिन्न होता है और क्या मुझे शायद अजगर पर सीपीथॉन का उपयोग करना चाहिए और यदि ऐसा है तो इसके फायदे क्या हैं?


जवाबों:


689

तो सीपीथॉन क्या है?

सीपीथॉन मूल पायथन कार्यान्वयन है। यह कार्यान्वयन है जिसे आप Python.org से डाउनलोड करते हैं। लोग इसे अन्य, बाद में, पायथन कार्यान्वयन से अलग करने के लिए, और पायथन प्रोग्रामिंग भाषा से भाषा इंजन के कार्यान्वयन को अलग करने के लिए इसे CPython कहते हैं

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

CPython सी में लागू होने के लिए होता है। यह वास्तव में कार्यान्वयन विवरण है। CPython आपके Python कोड को bytecode (पारदर्शी रूप से) में संकलित करता है और उस बाइटकोड को एक मूल्यांकन लूप में व्याख्या करता है।

सीपीथॉन भी नई सुविधाओं को लागू करने वाला पहला है; पायथन-द-भाषा विकास CPython को आधार के रूप में उपयोग करता है; अन्य कार्यान्वयन का पालन करें।

Jython, आदि के बारे में क्या?

Jython , IronPython और PyPy अजगर प्रोग्रामिंग भाषा की वर्तमान "अन्य" कार्यान्वयन हैं; ये क्रमशः जावा, C # और RPython (पायथन का एक उपसमूह) में लागू किया जाता है। Jython जावा बाइटकोड में आपके पायथन कोड को संकलित करता है, इसलिए आपका पायथन कोड JVM पर चल सकता है। IronPython आपको Microsoft CLR पर पायथन चलाने की सुविधा देता है । और PyPy, (एक उपसमुच्चय) पायथन में कार्यान्वित किया जा रहा है, आपको पायथन कोड को CPython की तुलना में अधिक तेज़ी से चलाने देता है, जो आपके दिमाग को सही ढंग से उड़ा देना चाहिए। :-)

वास्तव में सी के लिए संकलन

इसलिए CPython C से अपने Python कोड का अनुवाद स्वयं नहीं करता है। इसके बजाय, यह एक दुभाषिया लूप चलाता है। वहाँ है एक परियोजना है कि करता है सेल्सियस के लिए अजगर-इश कोड का अनुवाद, और कहा कि कहा जाता है Cython । साइथॉन पायथन भाषा में कुछ एक्सटेंशन जोड़ता है, और आपको अपने कोड को C एक्सटेंशन, कोड जो कि सीपीथॉन दुभाषिया में प्लग करता है, को संकलित करने देता है ।


93
मुझे लगता है कि यह उल्लेख के लायक है, सिद्धांत रूप में, किसी भी कार्यान्वयन का उपयोग करके एक पायथन स्क्रिप्ट को चलाया जा सकता है, और स्क्रिप्ट को चलाने के परिणाम समान होने चाहिए।
डगलस मेंडिजबाल

3
तथ्यों के परिणामस्वरूप, और जिस परियोजना पर आप काम कर रहे हैं, उसके आधार पर, कई कार्यान्वयन पर अपने पायथन कोड का परीक्षण और प्रोफाइल करना एक अच्छा विचार हो सकता है। जावा + जाइथॉन परियोजनाओं पर काम करने से पहले, आप कई आश्चर्य में पड़ सकते हैं क्योंकि देवों ने इस प्लेटफ़ॉर्म पर अपने काम का पर्याप्त परीक्षण नहीं किया है।
रहमू

9
यह कहना कि "PyPy CPython से अधिक तेज़ है" थोड़ा खतरनाक है जो मैं कहूंगा। उस प्रश्न का सटीक उत्तर देने के लिए यहाँ बहुत अच्छा उत्तर है: stackoverflow.com/questions/18946662/…
मैक्स लेसके

आयरनपाइथन के बारे में उत्साहित ... जब तक मैंने देखा कि यह केवल पायथन 2.x का समर्थन करता है।
सीन एंडरसन

@ सीनियनसन: सेम जथॉन के लिए जाता है (2015 तक आधिकारिक रिलीज केवल 2.5 संगत थी, इसे नौ में से बाहर कर दिया; उन्हें आखिरकार 2015 में 2.7 रिलीज हुई, लेकिन अभी भी 3.x रिलीज का कोई संकेत नहीं है)।
शैडो रेंजर

90

आपको एक भाषा और एक कार्यान्वयन के बीच अंतर करने की आवश्यकता है। पायथन एक भाषा है,

विकिपीडिया के अनुसार , "प्रोग्रामिंग भाषा प्रोग्राम लिखने के लिए एक संकेतन है, जो एक संगणना या एल्गोरिथ्म के विनिर्देश हैं"। इसका मतलब यह है कि यह कोड लिखने के लिए केवल नियम और वाक्यविन्यास है। अलग-अलग हमारे पास एक प्रोग्रामिंग भाषा कार्यान्वयन है जो ज्यादातर मामलों में, वास्तविक दुभाषिया या संकलक है।

अजगर एक भाषा है। CPython सी में अजगर का कार्यान्वयन है। Jython जावा में कार्यान्वयन है, और इसी तरह।

योग करने के लिए: आप पहले से ही CPython का उपयोग कर रहे हैं (यदि आप यहाँ से डाउनलोड करते हैं )।


2
आपको Martijn Pieters की पोस्ट पढ़नी चाहिए "CPython अपने Python कोड को C से स्वयं ट्रांसलेट नहीं करता है। यह बजाय इंटरप्रेटर लूप चलाता है। एक प्रोजेक्ट है जो Python-ish कोड को C में ट्रांसलेट करता है, और जिसे Cython कहा जाता है"
रेमंड। चेनोन

2
क्यों Cpython के बारे में बहुत कुछ है। यानी: हम Cc ++ या CJava या यहाँ तक कि CSwift नहीं सुनते। या क्या मैं कुछ न कुछ भूल रहा हूं ?
सुहैब

3
@Suhaib: वे करते हैं, जावा दुनिया में लोगों के पास है जैसे कि HotSpot, OpenJDK, IBM J9 JDK, Azul। वे आम तौर पर अधिक सटीक होते हैं, यानी आप वास्तव में "जावा इंस्टॉल नहीं करते" बल्कि "एक संगत जावा 8 जेडडीके स्थापित करें, उदाहरण के लिए ओरेकल जेडडीके 8"। जावास्क्रिप्ट दुनिया में आपके पास नोड.जेएस, वी 8 आदि हैं, आप "नोड स्थापित करें", "जावास्क्रिप्ट स्थापित करें", सही नहीं? लेकिन पाइथन की दुनिया में "पायथन 3.6 को स्थापित करना" कहना बहुत आम है और किया गया, एक भाषा युक्ति का उल्लेख करते हुए, एक विशिष्ट क्रम के लिए नहीं।
हेंडी इरावन

37

यहां तक ​​कि मुझे यह समझने में भी यही समस्या थी कि सीपीथॉन, जेपीथॉन, आयरनपिथॉन, PyPy एक दूसरे से अलग कैसे हैं।

इसलिए, मैं तीन चीजों को स्पष्ट करने के लिए तैयार हूं इससे पहले कि मैं व्याख्या करना शुरू करूं:

  1. अजगर : यह एक भाषा है, यह केवल व्याख्या करने वाले (खुद को अपने अजगर कोड को स्वीकार करने वाले कार्यक्रम) को व्यक्त / व्यक्त करने का वर्णन / वर्णन करता है।
  2. कार्यान्वयन : यह सब के बारे में है कि दुभाषिया कैसे लिखा गया था, विशेष रूप से, किस भाषा में और यह क्या करता है
  3. बाइटकोड : यह एक कोड है जिसे एक प्रोग्राम द्वारा संसाधित किया जाता है, जिसे आमतौर पर "वास्तविक" कंप्यूटर मशीन, हार्डवेयर प्रोसेसर के बजाय एक वर्चुअल मशीन के रूप में संदर्भित किया जाता है।

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

यदि आप CPython के bytecode को देखना चाहते हैं तो आप कर सकते हैं। यहाँ है कि आप कैसे कर सकते हैं:

>>> def f(x, y):                # line 1
...    print("Hello")           # line 2
...    if x:                    # line 3
...       y += x                # line 4
...    print(x, y)              # line 5
...    return x+y               # line 6
...                             # line 7
>>> import dis                  # line 8
>>> dis.dis(f)                  # line 9
  2           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('Hello')
              4 CALL_FUNCTION            1
              6 POP_TOP

  3           8 LOAD_FAST                0 (x)
             10 POP_JUMP_IF_FALSE       20

  4          12 LOAD_FAST                1 (y)
             14 LOAD_FAST                0 (x)
             16 INPLACE_ADD
             18 STORE_FAST               1 (y)

  5     >>   20 LOAD_GLOBAL              0 (print)
             22 LOAD_FAST                0 (x)
             24 LOAD_FAST                1 (y)
             26 CALL_FUNCTION            2
             28 POP_TOP

  6          30 LOAD_FAST                0 (x)
             32 LOAD_FAST                1 (y)
             34 BINARY_ADD
36 RETURN_VALUE

अब, उपरोक्त कोड पर एक नजर डालते हैं। लाइन्स 1 से 6 एक फ़ंक्शन परिभाषा है। पंक्ति 8 में, हम 'डिस' मॉड्यूल का आयात करते हैं जिसका उपयोग मध्यवर्ती पायथन बायटेकोड को देखने के लिए किया जा सकता है (या आप कह सकते हैं, पायथन बाइटकोड के लिए disassembler) जो कि सीपीथॉन (दुभाषिया) द्वारा उत्पन्न होता है।

नोट : मुझे इस कोड का लिंक #python IRC चैनल से मिला: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

और फिर, Jython है, जो जावा में लिखा गया है और जावा बाइट कोड का निर्माण करता है। जावा बाइट कोड जावा रनटाइम पर्यावरण पर चलता है, जो जावा वर्चुअल मशीन (जेवीएम) का कार्यान्वयन है। यदि यह भ्रामक है तो मुझे संदेह है कि आपके पास कोई सुराग नहीं है कि जावा कैसे काम करता है। आम शब्दों में, जावा (भाषा, संकलक नहीं) कोड जावा संकलक द्वारा लिया जाता है और एक फ़ाइल (जो जावा बाइट कोड है) को आउटपुट करता है जिसे केवल JRE का उपयोग करके चलाया जा सकता है। ऐसा इसलिए किया जाता है कि जब एक बार जावा कोड संकलित हो जाता है तो इसे जावा बाइट कोड प्रारूप में अन्य मशीनों में पोर्ट किया जा सकता है, जिसे केवल JRE द्वारा चलाया जा सकता है। यदि यह अभी भी भ्रमित हो रहा है तो आप इस वेब पेज पर एक नज़र डालना चाहते हैं ।

यहाँ, आप पूछ सकते हैं कि क्या CPython का बायटेकोड Jython की तरह पोर्टेबल है, मुझे संदेह नहीं है। बाईटकोड CPython कार्यान्वयन में उत्पादित कोड के आगे निष्पादन के लिए यह आसान बनाने के लिए है कि दुभाषिया के लिए विशिष्ट था (मैं यह भी कहा कि, इस तरह के मध्यवर्ती बाईटकोड उत्पादन संदेह है, बस आसानी के लिए प्रसंस्करण के कई अन्य व्याख्याकार में किया जाता है)।

तो, Jython में, जब आप अपना Python कोड संकलित करते हैं, तो आप Java बाइट कोड के साथ समाप्त होते हैं, जिसे JVM पर चलाया जा सकता है।

इसी प्रकार, आयरनपाइथन (सी # भाषा में लिखा गया) आपके पायथन कोड को कॉमन लैंग्वेज रनटाइम (सीएलआर) के रूप में संकलित करता है, जो माइक्रोसॉफ्ट द्वारा विकसित जेवीएम की तुलना में एक समान तकनीक है।


3
विस्तृत विवरण के लिए thx !! इसका मतलब है कि सीपीथॉन पायथन कोड को बाइट कोड में बदलने का ख्याल रखता है और मशीन कोड को बाइट कोड की भी व्याख्या करता है? अखरोट के खोल में सीपीथॉन कंपाइलर (पायथन से बाइट कोड के लिए) और पायथन वर्चुअल मशीन (बाइट कोड से मशीन कोड के लिए) है? .Net की तुलना में, MSIL से मशीन कोड में कनवर्ट करने के लिए C # को MSIL और CLR में कनवर्ट करने के लिए C # कंपाइलर है।
rahulaga_dev 14

30

यह लेख पायथन के विभिन्न कार्यान्वयनों के बीच अंतर को अच्छी तरह से बताता है। जैसे लेख डालता है:

एहसास करने वाली पहली बात यह है कि 'पायथन' एक इंटरफ़ेस है। पायथन को क्या करना चाहिए और इसे कैसे (किसी भी इंटरफ़ेस के साथ) व्यवहार करना चाहिए, इसका एक विनिर्देश है। और कई कार्यान्वयन हैं (किसी भी इंटरफ़ेस के साथ)।

एहसास की दूसरी बात यह है कि 'व्याख्या' और 'संकलित' एक कार्यान्वयन के गुण हैं, एक इंटरफ़ेस नहीं।


20

पायथन एक भाषा है: नियमों का एक सेट जिसका उपयोग कार्यक्रमों को लिखने के लिए किया जा सकता है। इस भाषा के कई कार्यान्वयन हैं।

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

CPython मूल कार्यान्वयन है, जो C. में लिखा गया है ("CPython" में "C" भाग उस भाषा को संदर्भित करता है जिसका उपयोग पायथन इंटरप्रेटर स्वयं लिखने के लिए किया गया था।)

Jython एक ही भाषा (Python) है, लेकिन इसे Java का उपयोग करके लागू किया गया है।

IronPython दुभाषिया C # में लिखा गया था।

वहाँ PyPy भी है - Python में लिखा एक Python दुभाषिया। अपनी पिक बनाओ :)


8

implementationइसका मतलब है कि पायथन को लागू करने के लिए किस भाषा का उपयोग किया गया था और न कि कैसे अजगर कोड को लागू किया जाएगा। सीपीथॉन का उपयोग करने का लाभ सी रन-टाइम की उपलब्धता के साथ-साथ सी / सी ++ के साथ आसान एकीकरण है।

इसलिए सीपीथॉन को मूल रूप से उपयोग करके लागू किया गया था C। मूल कार्यान्वयन के लिए अन्य कांटे थे जो अजगर को लीवर-एज जावा (जेथॉन) या .NET रनटाइम (आयरनपाइथन) के लिए सक्षम करते थे।

आपके द्वारा उपयोग किए जाने वाले कार्यान्वयन के आधार पर, लाइब्रेरी की उपलब्धता भिन्न हो सकती है, उदाहरण के लिए जाइटन में Ctypes उपलब्ध नहीं है , इसलिए ctypes का उपयोग करने वाला कोई भी पुस्तकालय जाइथन में काम नहीं करेगा। इसी तरह, यदि आप Java क्लास का उपयोग करना चाहते हैं, तो आप सीधे CPython से ऐसा नहीं कर सकते। आपको या तो एक गोंद (JEPP) की जरूरत है या फिर Jython (Python के जावा कार्यान्वयन) का उपयोग करने की आवश्यकता है


4

आपको पता होना चाहिए कि ग्लोबल इंटरप्रेटर लॉक की वजह से सीपीथॉन वास्तव में मल्टीथ्रेडिंग का समर्थन नहीं करता है । इसमें पुनरावृत्ति के लिए कोई अनुकूलन तंत्र नहीं है, और कई अन्य सीमाएँ हैं जिन्हें अन्य कार्यान्वयन और पुस्तकालय भरने की कोशिश करते हैं।

आपको इस पृष्ठ पर एक नज़र डालनी चाहिए अजगर विकी पर पर ।

इस पृष्ठ पर कोड स्निपेट देखें , यह आपको एक अच्छा विचार देगा कि दुभाषिया क्या है।


17
सीपीथॉन मल्टीथ्रेडिंग का समर्थन करता है, लेकिन जीआईएल कई कोर या सीपीयू का लाभ उठाना मुश्किल बनाता है। यह बिल्कुल समान नहीं है कि मल्टीथ्रेडिंग का समर्थन बिल्कुल नहीं है।
मार्टिज़न पीटर

0

मूल, और मानक, पायथन के कार्यान्वयन को आमतौर पर CPythonतब कहा जाता है जब आप इसे अन्य विकल्पों के साथ इसके विपरीत करना चाहते हैं ( और केवल सादा "पायथन" अन्यथा )। यह नाम इस तथ्य से आता है कि यह पोर्टेबल में कोडित है ANSI C language code। यह वह पायथन है जिसे आप http://www.python.org से लाते हैं , ActivePython और उत्साहित वितरण के साथ प्राप्त करते हैं , और स्वचालित रूप से अधिकांश लिनक्स और मैक ओएस एक्स मशीनों पर होते हैं। यदि आपको अपनी मशीन पर पायथन का प्रीइंस्टॉल्ड संस्करण मिला है, तो यह संभवतया CPythonतब तक है, जब तक कि आपकी कंपनी या संगठन अधिक विशिष्ट तरीकों से पायथन का उपयोग नहीं कर रहे हैं।

जब तक आप पाइथन के साथ स्क्रिप्ट Javaया .NETएप्लिकेशन नहीं करना चाहते हैं Stacklessया PyPyसम्मोहक या सम्मोहक के लाभ नहीं चाहते हैं, तब तक आप शायद मानक का उपयोग करना चाहते हैंCPython प्रणाली । क्योंकि यह भाषा का संदर्भ कार्यान्वयन है, यह सबसे तेज़ चलने के लिए, सबसे पूर्ण होने के लिए, और वैकल्पिक प्रणालियों की तुलना में अधिक अद्यतित और मजबूत हो सकता है।


3
मेरा अशिष्ट होने का मतलब नहीं है, लेकिन सीपीथॉन बिल्कुल तेज नहीं चलता है।
मायल्स

0

एक प्रोग्रामिंग भाषा कार्यान्वयन कंप्यूटर प्रोग्राम निष्पादित करने के लिए एक प्रणाली है।

प्रोग्रामिंग भाषा कार्यान्वयन के लिए दो सामान्य दृष्टिकोण हैं:

  • व्याख्या : एक दुभाषिया इनपुट को किसी भाषा में प्रोग्राम के रूप में लेता है, और किसी मशीन पर उस भाषा में लिखी गई क्रियाओं को करता है।
  • संकलन : एक कंपाइलर कुछ भाषा में एक प्रोग्राम के रूप में लेता है, और उस प्रोग्राम को किसी अन्य भाषा में ट्रांसलेट करता है, जो दूसरे इंटरप्रेटर या दूसरे कंपाइलर के इनपुट के रूप में काम कर सकता है।

पायथन 1991 में गुइडो वैन रोसुम द्वारा बनाई गई एक उच्च स्तरीय प्रोग्रामिंग भाषा है ।

सीपीथॉन पायथन कंप्यूटिंग भाषा का संदर्भ संस्करण है, जिसे सी में गुइडो वैन रोसुम द्वारा भी लिखा गया है ।

पायथन कार्यान्वयन की अन्य सूची

स्रोत

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.