पायथन प्रोग्राम को C / C ++ कोड में बदलें? [बन्द है]


149

क्या पायथन प्रोग्राम को C / C ++ में बदलना संभव है?

मुझे एल्गोरिदम के एक जोड़े को लागू करने की आवश्यकता है, और मुझे यकीन नहीं है कि यदि प्रदर्शन अंतराल सभी दर्द को सही ठहराने के लिए पर्याप्त है तो मैं इसे सी / सी ++ में कर रहा हूं (जो कि मैं अच्छा नहीं हूं)। मैंने एक सरल एल्गोरिथम लिखने के बारे में सोचा और इस तरह के एक परिवर्तित समाधान के खिलाफ बेंचमार्क किया। यदि वह अकेले पायथन संस्करण की तुलना में काफी तेज है, तो मेरे पास इसे C / C ++ में करने के अलावा कोई और विकल्प नहीं होगा।


32
जब पायथन बेंचमार्क पर हार जाता है, तो ध्यान रखें कि 50x या 100x मंदी अभी भी नकारात्मक है यदि गणना कुछ सेकंड में पायथन में समाप्त हो जाती है, और तब भी सच नहीं है जब आप बहुत सारे I / O करते हैं या एक भयानक एल्गोरिथ्म है। पूछने के बजाय "पायथन कितना धीमा है?" आपको पूछना चाहिए "पायथन काफी तेज है?" (और यह सबसे अधिक ईमानदारी से, ईमानदारी से है) - यह भी बेंचमार्किंग या यहां पूछने से अधिक तेज है।

1
अजगर में एक एल्गोरिथ्म को लागू करना काफी तेज और सीधे आगे है ... आपको बस इसे करना है और फिर जांचें कि क्या यह काफी तेज है। अधिकांश बार आप अलग-अलग डेटा संरचनाओं (सूचियों के बजाय तानाशाह / सेट) या विभिन्न ऑपरेशनों का उपयोग करके बहुत तेज़ी से चलाने के लिए एल्गोरिथ्म को अनुकूलित कर सकते हैं । वैसे भी अनुकूलन तब होना चाहिए जब आप पहले से ही एल्गोरिथ्म का पहला मसौदा लागू कर चुके हों और इसे बेंचमार्क / प्रोफाइल कर चुके हों।
बाकुरिु

@delnan: मेरे मामले में यह सब गणना समय के बारे में है। यदि सी वेरिएंट को x घंटे कम की आवश्यकता होती है, तो मैं उस समय को एल्गोरिदम को लंबे समय तक चलने देने में निवेश करूंगा। मैं बस यह पता लगाना चाहता हूं (मोटे तौर पर) पायथन कितना धीमा होगा - अगर यह सिर्फ कुछ घंटों का है तो मैं निश्चित रूप से ऐसी भाषा का उपयोग नहीं करूंगा जिसमें मैं सहज नहीं हूं (आप बुरे कार्यान्वयन के साथ समस्याओं के सर्वोत्तम समाधानों को बर्बाद कर सकते हैं: पी)।
क्रेजीफिलिंग क्लोसलाइन

@ पायथन के बारे में डेलन का अधिकार संभवत: कई चीजों के लिए काफी तेज है। यहां तक ​​कि जब यह धीमा हो जाता है, तो विचलन, रखरखाव, और भविष्य में वृद्धि में आसानी महत्वपूर्ण कारक हैं।
मार्टीन्यू

"x घंटे"? यह कितना बड़ा है? क्या आपने कोई कार्यान्वयन लागू किया है? क्या आपके पास माप है? क्या आपने कार्यान्वयन को प्रोफाइल किया है? या आप समय से पहले समाधान का अनुकूलन करने की कोशिश कर रहे हैं?
S.Lott

जवाबों:


115

हाँ। साइथन को देखो । यह ऐसा ही करता है: स्पीडअप के लिए पायथन को सी से परिवर्तित करता है।


6
बेशक, जब तक आप cdefघोषणाओं का एक गुच्छा नहीं जोड़ते हैं और तब तक आप कुछ भी नहीं बचा सकते हैं, जिससे स्थैतिक टाइपिंग शुरू होती है (अन्यथा आप सिर्फ अपारदर्शी PyObject *सामान को हथकंडा करते हैं )। और यह प्लेन C जितना तेज कभी नहीं मिलेगा क्योंकि यह आमतौर पर Python (100% या अधिक) के साथ इंटरफेस होता है। केवल सादे संख्यात्मक कोड के लिए जो Python के साथ सबसे अधिक समय तक इंटरफ़ेस नहीं करता है!)। लेकिन इसके अलावा, हाँ, यह आपको एक सुंदर डेवेंट स्पीडअप मिल सकता है।

7
@delnan: वास्तव में, यह आपको कुछ बचाता है। संकलित होने के बाद अधिकांश शुद्ध पायथन कोड तेज हो जाएगा। लेकिन हां, cdefs और स्थिर टाइपिंग के साथ आप वास्तव में अंतर देखना शुरू कर देते हैं। और अजगर के साथ इंटरफेसिंग आपको उन सभी मामलों में मिलता है जहां आप पायथन से सी का उपयोग करते हैं।
लेन्नर्ट रेगेब्र

136

यदि सी वेरिएंट को x घंटे कम की आवश्यकता होती है, तो मैं उस समय को एल्गोरिदम को लंबे समय तक चलने देने में निवेश करूंगा

"निवेश" यहाँ सही शब्द नहीं है।

  1. पायथन में एक कार्यशील कार्यान्वयन का निर्माण करें। C संस्करण समाप्त करने से पहले आप इसे पूरा कर लेंगे।

  2. पायथन प्रोफाइलर के साथ प्रदर्शन को मापें। आपको जो भी समस्याएँ मिलें उन्हें ठीक करें। डेटा संरचनाओं और एल्गोरिदम को बदलना, जैसा कि वास्तव में ठीक से करने के लिए आवश्यक है। सी में पहला संस्करण समाप्त करने से पहले आप इसे पूरा करेंगे।

  3. यदि यह अभी भी बहुत धीमा है, तो मैन्युअल रूप से अच्छी तरह से डिजाइन किए गए और ध्यान से निर्मित सी में पायथन का अनुवाद करें।

    जिस तरह से बाधा काम करता है, मौजूदा पायथन से दूसरा संस्करण (मौजूदा इकाई परीक्षणों के साथ, और मौजूदा रूपरेखा डेटा के साथ) करने के बावजूद सी कोड को खरोंच करने की कोशिश करने से भी तेज होगा।

यह उद्धरण महत्वपूर्ण है।

पहली बार टेलिस्कोप मेकर्स के लिए थॉम्पसन का नियम
चार इंच का दर्पण और फिर छह इंच का दर्पण बनाने की तुलना में छह इंच का दर्पण बनाना तेज है।

बिल मैककिनन
वांग इंस्टीट्यूट


15
जबरदस्त स्कोर के बावजूद, मैं यह नहीं देखता कि यह सवाल का जवाब कैसे देता है।
ऑड्रियस मेस्कॉस्कस

29

शेड स्किन "एक प्रतिबंधित (प्रतिबंधित) पायथन-टू-सी ++ कंपाइलर" है।


3
शेड स्किन का +1 लाभ एक प्रकार का निष्कर्ष है : यदि प्रोग्राम फ्लो से अनुमान चर प्रकारों को जाना संभव है, तो डायनेमिक टाइप-चेकिंग से बचा जाता है। यह आमतौर पर छोटे सी ++ कोड की ओर जाता है जो वास्तव में तेजी से कार्यक्रमों को पढ़ना और संकलित करना संभव है।
Kyss ताओ

1
इसमें पायथन → 11l → C ++ ट्रांसपिलर भी है, जो कि C ++ कंपाइलर के लिए एक प्रतिबंधित पायथन भी है, लेकिन यह कुछ पायथन विशेषताओं का समर्थन करता है, जो शेड स्किन (जैसे नेस्टेड फंक्शन / क्लोज़र) के साथ समर्थित नहीं है।
tav

17

हैकर की खबर में बस यह नया टूल आया ।

उनके पेज से - "न्युट्का पायथन इंटरप्रेटर के लिए एक अच्छा प्रतिस्थापन है और हर निर्माण को संकलित करता है जो CPython 2.6, 2.7, 3.2 और 3.3 ऑफ़र करता है। यह पायथन को C ++ प्रोग्राम में अनुवाद करता है जो तब" libththon "का उपयोग उसी तरह से निष्पादित करता है। CPython बहुत संगत तरीके से करता है। "


यह परियोजना अन्य समान विकल्पों की तुलना में बहुत अधिक परिपक्व है। यह हास्यास्पद है .exeकि यह ओएसएक्स पर विस्तार के साथ बाइनरी बनाता है, भले ही यह पूरी तरह से सामान्य ओएसएक्स मच-ओ निष्पादन योग्य हो। ऐसा लग रहा है के लिए एक अच्छा प्रतिस्थापन हो सकता है pyinstaller, py2exe, py2app, आदि --recurse-***झंडे हालांकि ठीक से सेट करने के लिए महत्वपूर्ण हैं।
ccpizza

Nuitka बढ़िया है, लेकिन बनाया गया C / C ++ कोड PyObject का उपयोग कर रहा है जो CPython-C-code-कार्यान्वयन के लिए बाध्य है। यह मुहावरेदार सी-कोड का उत्पादन नहीं करता है।
Make42

8

एक और विकल्प - शेड स्किन के अलावा सी ++ में कनवर्ट करना - पायथन है

मीका गोरेलिक और इयान ओज़वाल्ड द्वारा उच्च प्रदर्शन पायथन को उद्धृत करने के लिए :

अजगर पायथन के सबसेट के लिए एक पायथन-टू-सी ++ कंपाइलर है जिसमें आंशिक numpyसमर्थन शामिल है । यह नंबा और साइथॉन की तरह थोड़ा काम करता है - आप एक फ़ंक्शन के तर्कों को एनोटेट करते हैं, और फिर यह आगे टाइप एनोटेशन और कोड विशेषज्ञता के साथ काम करता है। यह वैश्वीकरण की संभावनाओं और OpenMP- आधारित समानांतरीकरण संभावनाओं का लाभ उठाता है। यह केवल पायथन 2.7 का उपयोग करता है।

पाइथ्रान की एक बहुत ही दिलचस्प विशेषता यह है कि यह स्वचालित रूप से समानांतर अवसरों (जैसे, यदि आप उपयोग कर रहे हैं map) को स्पॉट करने का प्रयास करेंगे , और आपको अतिरिक्त प्रयास की आवश्यकता के बिना इसे समानांतर कोड में बदल देंगे। आप pragma omp > निर्देशों का उपयोग करके समानांतर अनुभाग भी निर्दिष्ट कर सकते हैं ; इस संबंध में, यह साइथन के ओपनएमपी समर्थन के समान है।

दृश्यों के पीछे, पायथन दोनों सामान्य पायथन और संख्यात्मक कोड लेगा और आक्रामक तरीके से उन्हें संकलन करने का प्रयास करेगा, जो कि साइथन के परिणामों की तुलना में बहुत तेज C ++ में होगा।

आपको ध्यान देना चाहिए कि यह परियोजना युवा है, और आप बग का सामना कर सकते हैं; आपको यह भी ध्यान देना चाहिए कि विकास टीम बहुत ही अनुकूल है और कुछ ही घंटों में बग को ठीक कर देती है।


6

मुझे पता है कि यह एक पुराना धागा है लेकिन मैं वह देना चाहता था जो मुझे लगता है कि उपयोगी जानकारी है।

मैं व्यक्तिगत रूप से PyPy का उपयोग करता हूं जो पाइप का उपयोग करके स्थापित करना वास्तव में आसान है। मैं अन्य रूप से पायथन / PyPy दुभाषिया का उपयोग करता हूं, आपको अपने कोड को बदलने की आवश्यकता नहीं है और मैंने इसे मानक अजगर दुभाषिया (या तो पायथन 2x या 3x) की तुलना में लगभग 40 गुना तेज पाया है। मैं अपने कोड को प्रबंधित करने के लिए pyCharm सामुदायिक संस्करण का उपयोग करता हूं और मुझे यह पसंद है।

मुझे अजगर में कोड लिखना पसंद है क्योंकि मुझे लगता है कि यह आपको भाषा की तुलना में कार्य पर अधिक ध्यान केंद्रित करने की अनुमति देता है, जो मेरे लिए बहुत बड़ा प्लस है। और अगर आपको इसकी आवश्यकता और भी तेज है, तो आप हमेशा विंडोज, लिनक्स, या मैक के लिए एक बाइनरी संकलन कर सकते हैं (अन्य उपकरणों के साथ सीधे नहीं बल्कि संभव है)। अपने अनुभव से, मैं संकलित करते समय PyPy पर लगभग 3.5x स्पीडअप प्राप्त करता हूं, जिसका अर्थ अजगर से 140x तेज है। PyPy Python 3x और 2x कोड के लिए उपलब्ध है और यदि आप PyCharm की तरह एक IDE का उपयोग करते हैं, तो आप PyPy, Cython और Python के बीच बहुत आसानी से आदान-प्रदान कर सकते हैं (हालांकि प्रारंभिक शिक्षा और सेटअप में थोड़ा समय लगता है)।

कुछ लोग इस पर मुझसे बहस कर सकते हैं, लेकिन मैं PyPy को साइथन की तुलना में तेज पाता हूं। लेकिन वे दोनों महान विकल्प हैं।

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

उम्मीद है की वो मदद करदे।


2
मुझे पता है कि यह एक पुरानी टिप्पणी है, लेकिन धन्यवाद!
22 जून को

कोई बात नहीं, मुझे खुशी है कि यह उपयोगी था।
कटहल

PyPy की व्याख्या के संकलन के लिए आप किस सॉफ्टवेयर का उपयोग करते हैं?
वासिल वायस्किवस्की

विशेष रूप से PyPy नहीं, बस .py स्क्रिप्ट्स। Nuitka यदि आप "C / C ++ निष्पादन योग्य, या C / C ++ स्रोत कोड" और PyInstaller चाहते हैं यदि आप केवल एक निष्पादन योग्य (आसान) चाहते हैं। वहाँ भी py2exe है, लेकिन मुझे इसके साथ कम सफलता मिली, हालांकि मुझे यकीन है कि चीजों में सुधार हुआ है। PyInstaller केवल Windows निष्पादन योग्य (लिनक्स, और मैक के साथ काम करता है) के लिए भी क्रॉस प्लेटफॉर्म है। Nuitka अद्वितीय है क्योंकि मुझे लगता है कि यह एकमात्र "संकलक" है जो आपको प्रयोग करने योग्य स्रोत कोड देता है जिसे आप सिद्धांत रूप में आगे अनुकूलित कर सकते हैं। कुछ अन्य हैं जैसे कि bbFreeze, cx_Freeze और py2app, लेकिन मैंने उन्हें आज़माया नहीं है। शुभकामनाएँ!
जैकट्रैडर

1
मैंने पाइपी को साइथन से भी तेज दौड़ने के लिए पाया है। एक परीक्षण में मैंने वास्तव में PyPy को प्रोग्राम के C ++ संस्करण (प्रविष्टि प्रकार) के समान गति पाया।
एनवी 7

5

मुझे एहसास है कि काफी नए समाधान पर एक जवाब गायब है। अगर Numpy कोड में उपयोग किया जाता है, तो मैं पायथन को आज़माने की सलाह दूंगा:

http://pythran.readthedocs.io/

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

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

यह नूम्बा या अन्य परियोजनाओं की तुलना में एक बहुत बड़ा लाभ है, जिसके लिए समय-समय पर संकलन है, जिसके लिए (मेरी जानकारी के लिए), आपको वास्तव में कुशल होने के लिए छोरों का विस्तार करना होगा। और फिर लूप के साथ कोड केवल CPython और Numpy का उपयोग करते हुए बहुत अक्षम हो जाता है ...

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

एक और बिंदु: पायथ्रान अच्छी तरह से (और बहुत आसानी से) ओपनएमपी समानता का समर्थन करता है। लेकिन मुझे नहीं लगता कि mpi4py समर्थित है ...


4

http://code.google.com/p/py2c/ एक संभावना की तरह दिखता है - वे अपनी साइट पर भी उल्लेख करते हैं: साइथन, शेड्सिन और आरपीथॉन और पुष्टि करते हैं कि वे पायथन कोड को शुद्ध C / C ++ में परिवर्तित कर रहे हैं जो कि C से बहुत तेज है / C ++ पायथन एपीआई कॉल के साथ भरा गया। नोट: मैंने कोशिश नहीं की है लेकिन मैं जा रहा हूँ ..


1
ऐसा लगता है कि Py2C अभी भी एक अधूरी परियोजना है। इसे कुछ वर्षों में अपडेट नहीं किया गया है, इसलिए यह विचलित हो सकता है।
एंडरसन ग्रीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.