ब्राउज़र में पायथन: ब्रायंट, PyPy.js, स्कल्प्चर और ट्रांसक्रिप्ट के बीच चयन कैसे करें?


91

मैं यह देखकर बहुत उत्साहित हूं कि अब ब्राउज़र में पायथन को कोड करना संभव है। ये मुख्य उम्मीदवार हैं (कृपया कोई भी मेरी अनदेखी करें):

लेकिन उनके बीच चयन कैसे करें? एकमात्र स्पष्ट अंतर जो मैं देख सकता हूं कि स्केचिंग पायथन 2 पर आधारित है, जबकि ब्रायथन पायथन 3 पर आधारित है।

कृपया ध्यान दें: यह सिफारिशों या राय के लिए अनुरोध नहीं है। मैं वस्तुनिष्ठ तथ्य चाह रहा हूँ जो एक शिक्षित विकल्प को सूचित करेगा।


6
किसी चीज के लिए सर्वश्रेष्ठ पुस्तकालय की सिफारिश करने के लिए हमें पूछना उन मामलों में से एक है जो सहायता स्पष्ट रूप से बताती है कि स्टैकऑवरफ्लो इसके लिए अच्छा नहीं है। यह एक महान सवाल है, बस इस साइट के प्रारूप के लिए नहीं; आप शायद कुछ चर्चा-आधारित चाहते हैं, जैसे मेलिंग सूची या फ़ोरम।
१०'१५

2
Transcrypt ( transcrypt.org ) python3.5 inc के एक बड़े उपसमूह से संकलित करता है। मल्टीपल इनहेरिटेंस, फास्ट (कॉल मेमोइज़िंग) उत्पन्न करता है, छोटा, पठनीय कोड, मल्टीलेवल सोर्समैप्स का समर्थन करता है और अनुकूलन के बिना जेएस के किसी भी उपयोग का उपयोग कर सकता है। डिस्क्लेमर: मैंने इसे लिखा था।
जैक्स डी होगे

1
हाय fzzylogic, मैंने टैग जोड़ दिया है, इसलिए लोग अब SO पर सवाल पूछ सकते हैं। जेएस टैग को इसके द्वारा बदल दिया गया, क्योंकि यदि आप ब्राउज़र में पायथन का उपयोग करेंगे, तो यह खोज करने की सबसे कम संभावना है।
जैक्स डी होगे

1
मैंने शुरुआती लोगों के लिए ट्रांसक्रिप्ट के लिए एक तरह का ट्यूटोरियल लिखा है। आप इसे github.com/bunkahle/Transcrypt-Examples/blob/master/alerts/… और github.com/bunkahle/Transcrypt-Examples/blob-master/cookies/…
bunkus

1
27 upvotes के साथ dstromberg द्वारा हटाए गए उत्तर की एक अच्छी तुलना लिंक है: stromberg.dnsalias.org/~strombrg/pybrowser/python-browser.html
Cees Timmerman

जवाबों:


30

ब्राउज़र में पायथन चलाना वास्तव में अच्छा और अप-टू-डेट (2019 तक) लेख है जिसमें ब्रायथन, स्कल्प्चर, PyPy.js, Transcrypt, Pyodide, Batavia की तुलना की गई है । मैं इसे पढ़ने की अत्यधिक सलाह देता हूं।

निम्नलिखित तस्वीरों में एक अच्छा सारांश देखा जा सकता है।

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें


62

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

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

Brython ( Github) ब्राउज़र में रूपांतरण कर सकते हैं। इसलिए आप अजगर में लिखते हैं और brython.js इंजन पेज लोड होने पर इसे मक्खी पर जावास्क्रिप्ट में बदल देता है। यह वास्तव में सुविधाजनक है, और जितना आप सोच सकते हैं उससे कहीं अधिक तेज है। हालाँकि, brython.js इंजन जिसे आपको अपने पृष्ठों में शामिल करने की आवश्यकता है, लगभग 500Kb है। इसके अलावा, मानक पुस्तकालयों के आयात की बात है, जिसे ब्रायथन अलग-अलग .js फ़ाइलों के साथ एक्सएचआर अनुरोधों के साथ संभालती है। कुछ लिबर्ट पहले से ही brython.js में संकलित हैं, इसलिए हर आयात नई फ़ाइलों में नहीं खींचेगा, लेकिन यदि आप कई आयातों का उपयोग करते हैं, तो चीजें धीमी हो सकती हैं। हालाँकि, इसके आसपास तरीके हैं। मैंने ब्राउज़र डे टूल में नेटवर्क टैब की जांच करने के लिए क्या किया था, यह देखने के लिए कि पेज लोड होने पर क्या फाइलें खींची जा रही थीं, फिर मेरे द्वारा ब्रायटन src फ़ोल्डर की एक कॉपी में उपयोग की जा रही सभी फाइलों को हटा दें। और ब्रायथन के साथ शामिल स्क्रिप्ट को चलाएं (मुझे लगता है कि यह ब्राइथॉन / www / स्क्रिप्ट / मेक_वीएफएसडीएम पर है) जो पीआई_ वीएफएस.जज नामक एक फ़ाइल में सभी उपलब्ध परिवादों को संकलित करती है, जिसे आपको अपने एचटीएमएल से भी लिंक करना होगा। आम तौर पर, यह एक बहुत बड़ा 2MB + फ़ाइल बना देगा, लेकिन यदि आप उन चीजों को हटा देते हैं जो आप उपयोग नहीं कर रहे हैं, तो यह काफी छोटा हो सकता है। इसे इस तरह से करने का मतलब है कि आपको केवल brython.js, py_VFS.js और अपने अजगर कोड में खींचने की आवश्यकता है, और अतिरिक्त XHR अनुरोधों की आवश्यकता नहीं होगी।

Transcrypt ( Github ) दूसरी तरफ, एक के रूप में वितरित किया जाता है अजगर 3 पैकेजआप अपने टूलकिन में मैन्युअल रूप से या हुक का उपयोग कर सकते हैं, पहले से ही पिरामिड को जावास्क्रिप्ट में संकलित करने के लिए। इसलिए ट्रांसक्रिप्ट के साथ, आप अजगर में लिखते हैं, अजगर के खिलाफ ट्रांसक्रिप्ट को चलाते हैं और यह जावास्क्रिप्ट को बाहर निकालता है जिसे आप अपने प्रोजेक्ट में लिंक कर सकते हैं। यह एक पारंपरिक संकलक की तरह अधिक है कि यह आउटपुट पर कुछ नियंत्रण प्रदान करता है। उदाहरण के लिए, आप ES6 या ES5 को संकलित करने के लिए चुन सकते हैं, या इसे आउटपुट सोर्समैप्स से पूछ सकते हैं (कि डिबगिंग के दौरान ब्राउज़र सीधे आपको संबंधित अजगर कोड पर ले जाता है, जेनरेट किए गए जावास्क्रिप्ट कोड के इनसाइड।) ट्रांसक्रीप्ट की जावास्क्रिप्ट आउटपुट काफ़ी ट्रिक है ( या एक और तरीका है, यह सुंदर है और बहुत ही कठिन)। मेरे मामले में अजगर का 150kB अघोषित ES5 जावास्क्रिप्ट के 165kB में बदल जाता है। तुलना के माध्यम से, मेरी परियोजना के ब्रायथन संस्करण ने रूपांतरण के बाद लगभग 800Kb का उपयोग किया।

हालाँकि, Transcrypts terseness के लाभ प्राप्त करना, डॉक्स को थोड़ा पढ़ना (वास्तव में बस थोड़ा सा) की आवश्यकता होती है। उदाहरण के लिए, ट्रांसक्रिप्ट के साथ, पाइथॉन की 'सत्यता' जैसी डेटा संरचनाओं के लिए तानाशाही, सेट और सूची डिफ़ॉल्ट रूप से सक्षम नहीं है और विश्व स्तर पर यह सक्षम है कि टाइपकास्टिंग से संबंधित संभावित प्रदर्शन मुद्दों के कारण इसे हतोत्साहित किया जाए। स्पष्टता के लिए: सीपीथॉन के तहत, एक खाली तानाशाही, सेट या सूची में सत्य मूल्य गलत है, जबकि जावास्क्रिप्ट में इसे 'सत्य' माना जाता है .. उदाहरण:

myList = []
if myList:    # False in CPython bcs it's empty, true in javascript bcs it exists
    # do some things.

इसे संबोधित करने के कम से कम तीन तरीके हैं:

  • अजगर को जावास्क्रिप्ट में कनवर्ट करते समय -t फ्लैग का उपयोग करें उदाहरण: $ transcrypt -t python.py (अनुशंसित नहीं है, लेकिन संभवतः कोई समस्या नहीं है जब तक कि आप प्रदर्शन संवेदनशील कोड के आंतरिक छोरों में कई बार सत्यता की जांच नहीं करते ..)
  • अपने कोड का उपयोग करें __pragma__(tconv)या __pragma__(notconv)स्थानीय रूप से सत्य जैसे मानों के लिए स्वचालित रूपांतरण पर स्विच करने के लिए ट्रांसक्रिप्ट क्रॉलर को बताने के लिए।
  • सत्य मूल्य की जाँच करने के बजाय, समस्या को पूरी तरह से जाँचने से बचें len (myList)> 0 ... हो सकता है कि ज्यादातर स्थितियों के लिए ठीक हो, मेरे हल्के उपयोग के लिए काम करता है।

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

पायथन 3.5 को स्थापित करने के बाद इसे स्थापित करने की मुख्य बात यह थी:

  1. एक python3.5 प्रोजेक्ट फ़ोल्डर (बस प्रकार: python3.5 -m venv foldername - सेट करने के लिए 3.5 के लिए पैकेज मुद्दों के साथ समाधान) )। यह अन्य चीजों के बीच एक बिन सबफ़ोल्डर के साथ 'foldername' बनाता है।
  2. पाइप ('फ़ोल्डरनाम / बिन / पाइप स्थापित ट्रांसक्रिप्ट') के साथ ट्रांसक्रिप्ट पाइथन पैकेज स्थापित करें जो इसे फ़ोल्डरनाम / लिब / पाइथन 3.5 / साइट-पैकेज / ट्रांसक्रिप्ट के लिए स्थापित करता है।
  3. activateयदि आप हर बार फ़ोल्डरनाम / बिन / python3.5 के लिए पूर्ण पथ टाइप नहीं करना चाहते हैं तो वर्तमान टर्मिनल। टाइप करके सक्रिय करें: 'source foldername / bin / activate'
  4. कोड लिखना शुरू करें और इसे परीक्षण के लिए जावास्क्रिप्ट में संकलित करें। उस फ़ोल्डर के भीतर से संकलित करें जिसमें आप अपना कोड लिखते हैं। उदाहरण के लिए, मैंने फ़ोल्डरनाम / www / प्रोजेक्ट का उपयोग किया है। तो उस फ़ोल्डर में सीडी डालें और चलाएँ: 'transcrypt -b your_python_script.py'। यह आउटपुट को सबफ़ोल्डर में रखता है जिसे कहा जाता है __javascript__। फिर आप अपने HTML से आउटपुट जावास्क्रिप्ट से लिंक कर सकते हैं।

मुख्य मुद्दों को पार करते हुए

मुझे साधारण आवश्यकताएं हैं, इसलिए आपका लाभ भिन्न हो सकता है।

  • आपको जावास्क्रिप्ट या लिबर्टन मानक लिबास को जावास्क्रिप्ट लिबास के साथ बदलने की आवश्यकता है। इसलिए उदाहरण के लिए 'इंपोर्ट जोंस' ब्रायथन द्वारा प्रदान किया गया है, लेकिन ट्रांसक्रिप्ट के तहत आप एक जावास्क्रिप्ट लिब का उपयोग कर सकते हैं या सिर्फ सीधे अपने पायथन कोड में JSON.parse / JSON.stringify का उपयोग कर सकते हैं। अपने कोड में सीधे जावास्क्रिप्ट कोड का एक छोटा संस्करण शामिल करने के लिए इस प्रारूप का उपयोग करें (ट्रिपल उद्धरण नोट करें):

    __pragma__ ('js', '{}', '''
    // javascript code
    ''')
    
  • ब्रायटन के html विशिष्ट कार्य स्पष्ट रूप से ट्रांसक्रिप्ट के साथ काम नहीं करते हैं। बस सामान्य जावास्क्रिप्ट तरीके का उपयोग करें। उदाहरण: 1) ब्रायथन के तहत, आपने 'दस्तावेज़ [' आईडी '] का उपयोग करते हुए एक विशिष्ट HTML टैग का उल्लेख किया हो सकता है, लेकिन ट्रांसक्रिप्ट के साथ आप' document.getElementById '(' id ') का उपयोग करेंगे (जो कि आपके द्वारा किया जाता है) यह जावास्क्रिप्ट से)। 2) आप 'डेल नोडनेम' के साथ एक नोड नहीं हटा सकते हैं (bcs जो एक ब्रिथॉन फ़ंक्शन है)। 'Node.parentNode.removeChild (नोड)' जैसे कुछ का उपयोग करें। 3) जावास्क्रिप्ट विकल्प के साथ ब्राइटन के डोम कार्यों के सभी को बदलें। उदा। class_name = className; text = textContent; html = भीतर का HTML; जनक = parentNode; बच्चों = चाइल्डकोड आदि से मुझे लगता है कि अगर आपको किसी ऐसी चीज की जरूरत है जिसमें कुछ पुराने ब्राउजर्स के लिए जरूरी विकल्प हैं तो उसके लिए जावास्क्रिप्ट लाइब्रेरी हैं। 4) ब्रायटन के सेट_टाइम को javascripts के साथ बदल दिया जाता है। 5) ब्रायटन के html टैग जैसे BR () को सामान्य जावास्क्रिप्ट तरीके का उपयोग करने के साथ-साथ आपके द्वारा उपयोग किए जाने वाले किसी भी स्थान को पुनः लोड करने की आवश्यकता है <= dom मैनिपुलेशन सिंटैक्स। या तो सादे टेक्स्ट मार्कअप को इनर HTML के रूप में इंजेक्ट करें या जावास्क्रिप्ट सिंटैक्स का उपयोग करके तत्व बनाएं और फिर उन्हें सामान्य जावास्क्रिप्ट डोम सिंटैक्स का उपयोग करके संलग्न करें। मैंने यह भी देखा कि चेकबॉक्स के लिए ब्रायथॉन "यदि चेकबॉक्स = 'चेक किया गया':" का उपयोग करता है, लेकिन ट्रांसक्रिप्ट "चेकबॉक्स:" के साथ खुश है। या तो सादे टेक्स्ट मार्कअप को इनर HTML के रूप में इंजेक्ट करें या जावास्क्रिप्ट सिंटैक्स का उपयोग करके तत्व बनाएं और फिर उन्हें सामान्य जावास्क्रिप्ट डोम सिंटैक्स का उपयोग करके संलग्न करें। मैंने यह भी देखा कि चेकबॉक्स के लिए ब्रायथॉन "यदि चेकबॉक्स = 'चेक किया गया':" का उपयोग करता है, लेकिन ट्रांसक्रिप्ट "चेकबॉक्स:" के साथ खुश है। या तो सादे टेक्स्ट मार्कअप को इनर HTML के रूप में इंजेक्ट करें या जावास्क्रिप्ट सिंटैक्स का उपयोग करके तत्व बनाएं और फिर उन्हें सामान्य जावास्क्रिप्ट डोम सिंटैक्स का उपयोग करके संलग्न करें। मैंने यह भी देखा कि चेकबॉक्स के लिए ब्रायथॉन "यदि चेकबॉक्स = 'चेक किया गया':" का उपयोग करता है, लेकिन ट्रांसक्रिप्ट "चेकबॉक्स:" के साथ खुश है।

  • मैंने पिछले सप्ताह एक 2700 लाइन परियोजना को आगे बढ़ाया, जिस समय ट्रांसक्रिप्ट में कुछ मामूली चीजों के लिए समर्थन नहीं था (हालांकि वे भराव के साथ बदलने के लिए पर्याप्त आसान थे), ये 1 थे) str.lower, str.split (str। विभाजन मौजूद है, लेकिन ऐसा लगता है कि जावास्क्रिप्ट विभाजन, जो अजगर संस्करण के लिए अलग तरह से काम करता है, जिसके व्यवहार पर मैं भरोसा कर रहा था), 2) गोल (यह अब देव संस्करण में समर्थित प्रतीत होता है) और 3)। 'str, int और float पर t काम, केवल तानाशाही, सूची और सेट पर। 4) ब्रायटन का एक और अंतर मैंने देखा है कि अगर मैं एक ताना के JSON प्रतिनिधित्व में खींचता हूं, तो मुझे 'myDict = dict (डेटा)' का उपयोग करके ऐसा करने की आवश्यकता है, जबकि ब्रिथॉन 'myDict = data' से खुश था। लेकिन यह ब्रेटन के json.loads में कुछ से संबंधित हो सकता है, जिसे मैंने सीधे JSON.parse से बदल दिया था।__pragma__('opov')स्थानीय के लिए), आप ओवरलोड प्रारूप का उपयोग करके सेट ऑपरेशन जैसी चीजें नहीं कर सकते हैं, लेकिन संबंधित कार्यों का उपयोग करने की आवश्यकता है। उदाहरण के लिए

    a = set([1, 2, 3])
    b = set([3, 4, 5])
    a.difference(b)             # is used instead of a - b
    a.union(b)                  # used instead of a | b
    a.intersection(b)           # used instead of a & b
    a.symmetric_difference(b)   # used instead of a ^ b
    

6) इसके अलावा, आप (cmd लाइन -i को सक्षम किए बिना) डिफ़ॉल्ट रूप से 'i में मैं के लिए:' का उपयोग करके इसे ड्यूरेट नहीं कर सकते __pragma__('iconv'), लेकिन आप इसे केवल कुंजियों () सदस्य का उपयोग करके सक्षम करने से बच सकते हैं:

for key, value in dict.items():
    # do things for each key and value..

संक्षेपित करते हुए

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

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

आशा है कि किसी को यह देखने में मदद करता है कि इनमें से कौन सा अपने विशेष प्रोजेक्ट के लिए अच्छा हो सकता है।


1
क्या आप सुनिश्चित हैं कि ब्रायथन एक ट्रांसपिलर है? मुझे पूरा यकीन है कि यह जावास्क्रिप्ट में पायथन दुभाषिया को लागू करता है। यदि यह एक ट्रांसपिलर था, तो आपको इसे अपने ऐप के साथ बंडल करने की आवश्यकता नहीं होगी।
कार्ल स्मिथ

@ कार्ल स्मिथ दिलचस्प बिंदु, इस तरह के बारे में नहीं सोचा था। ब्रायथन ने अजगर कोड को जावास्क्रिप्ट में परिवर्तित कर दिया, लेकिन चूंकि जावास्क्रिप्ट में एक मानक बाईटेकोड नहीं है, हो सकता है कि कोई ब्रायथन इंजन के लिए उत्पन्न जावास्क्रिप्ट को 'बायटेकोड' के रूप में देख सके।
fzzylogic

1
आपने मुझे गलत समझा। मुझे नहीं लगता कि ब्रेटन ने पायथन को जावास्क्रिप्ट में बिल्कुल भी स्थानांतरित किया है। यह सी। के बजाय जेएस में एक पायथन इंटरप्रेटर को लागू करता है, उनके अनुसार GitHub README "ब्रायथन (ब्राउज़र पायथन) ब्राउज़र में चल रहे पायथन 3 का कार्यान्वयन है, जो डोम तत्वों और घटनाओं के लिए एक इंटरफेस है"।
कार्ल स्मिथ

4
@jsbueno वर्तमान में उपलब्ध बीज, रैंडिन्ट, पसंद और यादृच्छिक हैं, जो केवल एक प्रारंभिक बिंदु के रूप में हैं। वास्तव में हम आशा करते हैं कि कोई व्यक्ति इसे उठाएगा और इसे पूरा करेगा, जैसा कि फिर से किया गया था, जो हमारी सूची में उच्च था। कठिन नहीं होना चाहिए। पुस्तकालयों की मात्रा बढ़ी है, लेकिन योगदान बहुत स्वागत है। जबकि उच्चारण जेएस के उपयोगों पर रहेगा, मैं व्यक्तिगत रूप से और अधिक मानक का स्वागत करूंगा।
जैक्स डी होगोग

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

12

https://brythonista.wordpress.com/2015/03/28/comparing-the-speed-of-cpython-brython-skulpt-and-pypy-js/

यह पृष्ठ तीन उम्मीदवारों को बेंचमार्क करता है। ब्रायथन एक स्पष्ट विजेता के रूप में उभरता है।

'मदद' की व्याख्या के बावजूद कि एसओ इस तरह के प्रश्न के लिए अच्छा नहीं है, ऐसा प्रतीत होता है कि इस मामले में एक संक्षिप्त जवाब संभव है।

शायद लोगों को बहुत जल्दबाजी हो रही है?


5
पिछली बार मैंने ब्रायथॉन की जाँच की थी यह अजगर का पूर्ण कार्यान्वयन नहीं था। यह भी स्पष्ट नहीं है कि "सर्वश्रेष्ठ" या "इन के बीच चयन कैसे करें" को मापा जाना चाहिए। सबसे तेज़? पाइथन को ज्यादातर गति के लिए उपयोग नहीं किया जाता है। अधिकांश कार्यों / पुस्तकालयों को लागू करता है? ऐसे मॉड्यूल हो सकते हैं जिनका आप कभी भी ब्राउज़र में उपयोग नहीं करेंगे। क्या सामान्य ऑपरेशन (ट्री हेरफेर) के लिए अतिरिक्त (cpython के अनुरूप नहीं) सिंटैक्स एक प्लस या एक माइनस है? मुझे नहीं लगता कि एक बेंचमार्क में प्रदर्शन यह सार्थक है।
पर्यायवाची

प्रदर्शन बेंचमार्क एक महत्वपूर्ण कारक है जब यह लगभग 20 - 40% तेजी से नहीं होता है - बल्कि कुछ कार्यों में लगभग 1000% सुधार होता है। ब्रायसन, जावास्क्रिप्ट पर एक उच्च वजन वाली परत है, इसलिए यह अलग है। इसके अलावा, परियोजना इन दिनों बहुत Python3 के अनुरूप है - जो कुछ भी करता है वह इस परियोजना में कुछ, अच्छी तरह से ज्ञात और परिपक्व जावास्क्रिप्ट पुस्तकालयों को शामिल करना है, उदाहरण के लिए बड़े-पूर्णांक हैंडलिंग के लिए।
jsbueno

12

मैंने स्काइप के साथ-साथ pypyjs के लिए उपयोग और प्रतिबद्ध है। और वे तीनों बहुत अलग हैं कि अगर आप मुझसे पूछें तो कोई भी तुलना लूट है।

यह इस बात पर निर्भर करता है कि आप किस चीज की तलाश कर रहे हैं जो सबसे ज्यादा मायने रखेगा।

PyPyJS

pypyjs विशाल है यह एक 12MB जावास्क्रिप्ट फ़ाइल है जिसमें संपूर्ण pypy वर्चुअल मशीन है। तो अगर आप अजगर को लागू करने की पूर्णता चाहते हैं तो यह आपका बच्चा है। यह एक जावास्क्रिप्ट पुल है जो वास्तव में अच्छा काम करता है लेकिन यह आपके जावास्क्रिप्ट वेबसाइट कोड को अजगर में लिखने के लिए एक व्यवहार्य विकल्प नहीं है। हालांकि यह आपको देगा import compiler

यह emscripten के साथ बनाया गया है और तेज है तो CPython, पिस्टन बेंचमार्क चलाने में।

मैंने यहाँ स्लाइड्स के बारे में pyyjs के बारे में एक छोटी सी बात बताई ।

Skulpt

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

while (True):
    print "hi"

ब्राउज़र को लॉक किए बिना।

मूर्तिकला केवल एक है जो अतुल्यकालिक निरंतरताओं का समर्थन करता है, यह आपको अजगर के निष्पादन को रोक देता है जबकि यह होने वाली कुछ अतुल्यकालिक चीज़ को हल कर रहा है। यह काम करना:

from time import sleep
sleep(1)

जब सीपीस्टोन की तुलना की जाती है, तो स्काइप सीपीथॉन की गति के दसवें हिस्से पर होती है।

Brython

मुझे कम से कम इस बारे में पता है कि शायद @ olemis-lang इस का विस्तार कर सकता है। लेकिन स्पष्ट अंतर के आगे कि ब्रायथन py3 है और अन्य py2 हैं। ब्रायथन भी एक ट्रांसपिलर है।

ब्राइटन ने पिस्टन बेंचमार्क नहीं चलाया क्योंकि time.clock लागू नहीं किया गया है, क्योंकि आधिकारिक तौर पर यह एक हार्डवेयर फ़ंक्शन है।


PyPyJS डेवलपर्स ने विकास को रोक दिया है। इसके अलावा Python3 समर्थन अभी भी अधूरा लगता है। github.com/pypyjs/pypyjs/issues/213 और github.com/pypyjs/pypyjs/issues/172
रोलैंड पिहलकास

यह बनाए रखा नहीं है, लेकिन इसका मतलब यह नहीं है कि यह काम नहीं करता है :) trinket.io/pypyjs लेकिन इस जगह को देखो मुझे पूरा यकीन है कि कुछ फिर से बुलबुला होगा। इसके अलावा, आप खुले स्रोत को बनाए रखने की उम्मीद नहीं कर सकते, जब तक कि आप इसे स्वयं न करें। :)
अल्बर्टजान

यह मुझे लगता है कि पायथन 2 के साथ ट्रिनेट ब्राउज़र साइड में चलता है, जबकि ट्रिनेट विथ पायथन 3 (और सुपी) सर्वर साइड पर चलता है। यह अभी भी प्रभावशाली है कि वे ब्राउज़र में प्रदान की जाने वाली दृश्य साजिश रचने का प्रबंधन करते हैं, भले ही कोड सर्वर साइड में चलता हो। यह जानना बहुत उपयोगी होगा कि उन्होंने यह कैसे हासिल किया। आपके पास कोई विचार है?
रोलैंड पिहलकास

1
Trinket GlowScript लाइब्रेरी (glowscript.org) का उपयोग करता है जो Python को JavaScript में बदलने के लिए RapydScript-NG का उपयोग करता है, और WebGL के 3 डी एनिमेशन का निर्माण करने के लिए। ट्रांसप्लिंग और निष्पादन दोनों ही ब्राउज़र में किए जाते हैं। यहाँ GlowScript आर्किटेक्चर का अवलोकन है: vpython.org/contents/VPythonArchitecture.pdf
user1114907

7

सबसे पहले मैं एक ब्रायथॉन कमिटर हूं। फिर भी मैं एक उद्देश्य मूल्यांकन करने के लिए जितना संभव हो उतना निष्पक्ष होने का प्रयास करूंगा।

पिछली बार जब मैंने इसका इस्तेमाल किया था तो स्कल्पचर में जेनरेटर एक्सप्रेशन जैसे फीचर्स का समर्थन नहीं किया था। ब्रायथन और PyPy.js ऐसा करते हैं, इसलिए फीचर स्तर पर IMHO बाद में श्रेष्ठ हैं।

ब्रायथन (इस समय) अभी भी प्रगति पर है। कुछ मॉड्यूल आयात नहीं किए जा सकते हैं (जैसे xml.ElementTree )। फिर भी यह स्थिति तब से बदलने लगी है जब हम मानकों के साथ पूर्ण अनुकूलता प्राप्त करने के बावजूद पूरे सीपीथॉन परीक्षण सूट को चलाने की दिशा में काम कर रहे हैं (कम से कम जब यह समझ में आता है)।

ब्रायथन मॉड्यूल आयात को गति देने के लिए .vfs.js का भी समर्थन करता है।

PyPy.js में कई विशेषताएं हैं जो PyPy (JIT संकलन, अच्छी तरह से परीक्षण की गई ...) द्वारा संचालित होने के तथ्य से सीधे-सीधे अनुसरण करती हैं, लेकिन मुझे यकीन नहीं है कि यह ब्राउज़र में चलने के लिए उपयुक्त है। परियोजना के विकसित होते ही यह बदल सकता है।

TODO: मैं विश्वसनीय बेंचमार्क के साथ अपने उत्तर को पूरक बनाने का प्रयास करूंगा।


8
मूर्तिकला के लिए एक कमिटेटर के रूप में मैं आपको बता सकता हूं कि यह जनरेटर अभिव्यक्तियों का समर्थन करता है। :)
अल्बर्टजन

6

यहाँ उल्लेख नहीं है रैपिडस्क्रिप्ट या रैपिडस्क्रिप्ट-एनजी। वे बहुत कुशल जावास्क्रिप्ट कोड का उत्पादन करते हैं, जिसका उपयोग GlowScript VPython (glowscript.org) में किया जाता है। मैं एलेक्स Tsepkov ( https://github.com/atsepkov/RapydScript ) के मूल रैपिडस्क्रिप्ट का उपयोग करता था, लेकिन हाल ही में कोविद गोयल ( https://github.com/kovidgoyal-rapydscript-ng ) के रैपिडस्क्रिप्ट-एनजी पर स्विच किया गया । मैंने हाल ही में CPython, RapydScript और Brython पर पिस्टन बेंचमार्क चलाया, और आप यहां परिणाम देख सकते हैं:

https://groups.google.com/forum/?fromgroups&hl=en#!topic/brython/20hAC9L3ayE


क्या आप परिणामों को संक्षेप में बता सकते हैं?
Jay

1
18 जून को, पियरे क्वेंटेल ने कहा, "ठीक है, प्रदर्शन का मुद्दा है, लेकिन चीजें बेहतर हो रही हैं; वर्तमान में मैं जिस रिलीज (3.2.7) पर काम कर रहा हूं, वह 3.2.6 की तुलना में 2.5% तेज गति से पिस्टन परीक्षण करता है। यह अभी भी 15 है। सीपीथॉन की तुलना में कई बार धीमा, लेकिन शुरुआती दिनों में यह हजारों गुना धीमा था। "
user1114907

1
मैंने रैपिड्सस्क्रिप्ट-एनजी ट्रांसपिलर का उपयोग करके पिस्टन बेंचमार्क को चलाया, और यह मेरे विंडोज 10 कंप्यूटर पर सीपीथॉन की 5 गुना गति, 600000 पिस्टन / सेकंड बनाम 125000 पिस्टन / सेकंड को बेंचमार्क किया। रेपीडस्क्रिप्ट-एनजी के लिए लगभग 5 गुना CPython की गति का कारक लगभग 7 गुना CPython तक बढ़ जाता है अगर मैं ऑपरेटर को ओवरलोडिंग बंद कर देता हूं जो GlowScript VPython में उपयोग किया जाता है, जिसमें उदाहरण के लिए a + b को ["+"] में परिवर्तित किया जाता है (b) ; यह 3 डी वैक्टर के आसान हेरफेर की अनुमति देने के लिए किया जाता है।
user1114907

मैं यह कहने में विफल रहा कि क्वेंटेल की टिप्पणी ब्रायंट को संदर्भित है।
user1114907

2
मैंने कोई और बेंचमार्क नहीं चलाया है। जब मैंने रैपिडस्क्रिप्ट का विकास रोक दिया, तो मैंने शुरू में रैपिडस्क्रिप्ट-एनजी पर स्विच किया। फिर बाद में, जब एलेक्स त्सेपकोव विकास में लौट आया, तो मैंने उसके साथ एक आदान-प्रदान किया जिसमें उसने यह भी स्वीकार किया कि कोविद गोयल की एनजी परियोजना glowscript.org पर मेरे विशेष उपयोग के लिए अधिक उपयुक्त है। त्सेपकोव वेब प्रोग्रामरों के लिए एक मिश्रित पायथन / जावास्क्रिप्ट भाषा का निर्माण करना चाहता है, जबकि गोयल मानक पायथन को सन्निकटित करने पर जोर देता है और ब्राउज़र में संकलन के लिए अच्छा समर्थन प्रदान करता है, दोनों मेरे काम के लिए महत्वपूर्ण हैं।
14:11 बजे user1114907

4

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

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

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


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

3

यह एक अद्यतन सम्मेलन है जो बाजार में उपलब्ध सभी विकल्पों की तुलना करता है:

https://www.youtube.com/watch?v=2XSeNQyPlTY

स्पीकर रसेल कीथ-मैगी है, जो क्षेत्र में एक प्रसिद्ध डेवलपर है।

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