शेड स्किन - पायथन से C ++ तक प्रयोगात्मक अनुवादक

परिचय



शेड स्किन पाइथन से C ++ का एक प्रायोगिक कंपाइलर है जिसे पायथन सघन कार्यक्रमों की गति बढ़ाने के लिए डिज़ाइन किया गया है। यह पायथन भाषा के सीमित सबसेट में लिखे गए कार्यक्रमों को C ++ में परिवर्तित करता है। C ++ कोड को निष्पादन योग्य कोड में संकलित किया जा सकता है, जो एक अलग प्रोग्राम या एक एक्सटेंशन मॉड्यूल हो सकता है, आसानी से आयात किया जा सकता है और एक नियमित पायथन प्रोग्राम में उपयोग किया जाता है।



शेड स्किन सी ++ संस्करण के लिए आवश्यक स्पष्ट प्रकार की घोषणाओं को उत्पन्न करने के लिए पायथन प्रोग्राम में उपयोग किए जाने वाले मिलान प्रकारों का उपयोग करता है। क्योंकि C ++ एक स्थिर टाइप की गई भाषा है, शेड स्किन के लिए पाइथन कोड को लिखा जाना आवश्यक है, ताकि सभी चरों का एक विशिष्ट प्रकार हो।

टाइपिंग और भाषा के सबसेट पर प्रतिबंध के अलावा, समर्थित प्रोग्राम मानक पायथन लाइब्रेरी का स्वतंत्र रूप से उपयोग नहीं कर सकते हैं, हालांकि लगभग 25 आमतौर पर उपयोग किए जाने वाले मॉड्यूल, जैसे कि यादृच्छिक और पुन: समर्थित हैं, (लाइब्रेरी सीमाएँ देखें)।

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

चूंकि शेड स्किन अभी भी विकास के प्रारंभिक चरण में है, इसलिए यह नाटकीय रूप से सुधार कर सकता है। फिलहाल, आप इसका उपयोग करने की प्रक्रिया में किसी भी त्रुटि का सामना कर सकते हैं। कृपया हमें उनके बारे में एक रिपोर्ट भेजें ताकि हम उन्हें ठीक कर सकें!

शेड स्किन वर्तमान में 2.7 के माध्यम से पायथन संस्करणों 2.4 के साथ संगत है, 2.6 की तरह व्यवहार करता है, और विंडोज और जीएनयू / लिनक्स और ओएसएक्स जैसे अधिकांश यूनिक्स प्लेटफार्मों पर चलता है।

टाइपिंग प्रतिबंध



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

a = 1 a = '1' #  


अस्वीकार्य। हालाँकि, C ++ में, प्रकार सार हो सकते हैं, जैसे कोड

 a = A() a = B() #  


उदाहरण के लिए A और B का एक सामान्य आधार वर्ग है।

टाइप करने पर प्रतिबंध का मतलब यह भी है कि एक ही संग्रह के तत्व (सूची, सेट, आदि) अलग-अलग प्रकार के नहीं हो सकते हैं (क्योंकि उनके सदस्यों के प्रकार भी स्थिर होने चाहिए)। तो कोड:

 a = ['apple', 'b', 'c'] #  b = (1, 2, 3) #  c = [[10.3, -2.0], [1.5, 2.3], []] #  


चलो कहते हैं, लेकिन कोड

 d = [1, 2.5, 'abc'] #  e = [3, [1, 2]] #  f = (0, 'abc', [1, 2, 3]) #  


अस्वीकार्य। शब्दकोशों की कुंजी और मूल्य विभिन्न प्रकार के हो सकते हैं:

 g = {'a': 1, 'b': 2, 'c': 3} #  h = {'a': 1, 'b': 'hello', 'c': [1, 2, 3]} #  


शेड स्किन के वर्तमान संस्करण में, मिश्रित प्रकारों को लंबाई दो के tuples में भी अनुमति दी जाती है:

 a = (1, [1]) #  


भविष्य में, मिश्रित प्रकारों को लंबे समय तक ट्यूल में रखने की अनुमति दी जा सकती है।

कोई भी प्रकार केवल गैर-अदिश प्रकारों के साथ मिश्रित नहीं किया जा सकता है (जो कि इंट, फ्लोट, बूल या जटिल के साथ नहीं है):

 l = [1] l = None #  


 m = 1 m = None #  


 def fun(x = None): # :     x, , x = -1 pass fun(1) 


पूर्णांक और फ़्लोट्स (पूर्णांक और फ़्लोट्स) आमतौर पर मिश्रित हो सकते हैं (पूर्णांक फ़्लोट बन जाते हैं)। यदि यह संभव नहीं है, तो शेड स्किन एक त्रुटि संदेश प्रदर्शित करेगी।

पायथन सबसेट की सीमाएँ



शेड स्किन हमेशा पायथन भाषा की सभी विशेषताओं का एक सबसेट का समर्थन करेगी। वर्तमान में, निम्नलिखित विशेषताएं समर्थित नहीं हैं:



कुछ अन्य विशेषताएं केवल आंशिक रूप से समर्थित हैं:



पुस्तकालय प्रतिबंध



फिलहाल, निम्नलिखित 25 मॉड्यूल भारी समर्थन करते हैं। उनमें से कुछ, जैसे कि ओस.पथ, को शेड स्किन का उपयोग करके सी ++ में अनुवाद किया गया है।



ध्यान दें कि किसी भी अन्य मॉड्यूल, जैसे कि pygame, pyqt या अचार, का उपयोग शेड स्किन के उपयोग से उत्पन्न एक्सटेंशन मॉड्यूल के साथ किया जा सकता है। इस तरह के उपयोग के उदाहरणों के लिए, शेड स्किन उदाहरण देखें।

स्थापना



दो प्रकार के इंस्टॉलर हैं: एक बूट-अनपैकिंग विंडोज इंस्टॉलर और एक यूनिक्स संग्रह। लेकिन, निश्चित रूप से, यह बेहतर है कि शेड स्किन ने पैकेज मैनेजर का उपयोग करके GNU / Linux इंस्टॉलेशन पैकेज मैनेजर (शेड स्किन कम से कम डेबियन, उबंटू, फेडोरा और आर्क) पर उपलब्ध है।

विंडोज


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

यूनिक्स


पैकेज प्रबंधक के माध्यम से स्थापना


उदाहरण के लिए Ubuntu

 sudo apt-get install shedskin 


मैनुअल स्थापना


मैन्युअल रूप से UNIX संग्रह से वितरण पैकेज स्थापित करने के लिए, निम्नलिखित करें:



पर निर्भर करता है


शेडस्किन जनित कार्यक्रमों को संकलित करने और चलाने के लिए, निम्नलिखित पुस्तकालयों की आवश्यकता होती है:



Ubuntu के तहत इन पुस्तकालयों को स्थापित करने के लिए, टाइप करें:

 sudo apt-get install g++ libpcre++dev python-all-dev libgc-dev 


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

 ./configure --prefix=/usr/local --enable-threads=posix --enable-cplusplus --enable-thread-local-alloc --enable-large-config make make check sudo make install 


यदि PCRE लाइब्रेरी आपके पैकेज मैनेजर के माध्यम से उपलब्ध नहीं है, तो निम्न विधि का उपयोग करें। उदाहरण के लिए, वेबसाइट से संस्करण 8.12 डाउनलोड करें, इसे अनज़िप करें और इसे निम्नानुसार स्थापित करें:

 ./configure --prefix=/usr/local make sudo make install 


OSX
मैनुअल स्थापना


OSX सिस्टम पर UNIX संग्रह से शेड स्किन को स्थापित करने के लिए, निम्नलिखित कार्य करें:



पर निर्भर करता है


शेडस्किन द्वारा उत्पन्न कार्यक्रमों को संकलित और चलाने के लिए, निम्नलिखित पुस्तकालयों की आवश्यकता होती है:



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

 ./configure --prefix=/usr/local --enable-threads=posix --enable-cplusplus --enable-thread-local-alloc --enable-large-config make make check sudo make install 


यदि PCRE लाइब्रेरी आपके पैकेज मैनेजर के माध्यम से उपलब्ध नहीं है, तो निम्न विधि का उपयोग करें। उदाहरण के लिए, वेबसाइट से संस्करण 8.12 डाउनलोड करें, इसे अनज़िप करें और इसे निम्नानुसार स्थापित करें:

 ./configure --prefix=/usr/local make sudo make install 


एक नियमित कार्यक्रम प्रसारित करना



विंडोज पर, उस निर्देशिका में पहली बार (डबल-क्लिक करें) init.bat फ़ाइल जहाँ आपने शेड स्किन स्थापित की है।

निम्नलिखित साधारण परीक्षण कार्यक्रम को संकलन करने के लिए कहा जाता है:
print 'hello, world!'


दर्ज करें:
shedskin test


दो C ++ फाइलें test.cpp और test.hpp के नाम के साथ-साथ Makefile के साथ बनाई गई हैं।

परीक्षण (या test.exe) नामक एक निष्पादन योग्य फ़ाइल बनाने के लिए, टाइप करें:

 make 


एक विस्तार मॉड्यूल बनाना



एक्सटेंशन मॉड्यूल के रूप में simple_module.py नाम के निम्नलिखित प्रोग्राम को संकलित करने के लिए:

 # simple_module.py def func1(x): return x+1 def func2(n): d = dict([(i, i*i) for i in range(n)]) return d if __name__ == '__main__': print func1(5) print func2(10) 


दर्ज करें:

 shedskin -e simple_module make 


गैर-विंडोज सिस्टम पर सफलतापूर्वक चलने के लिए 'मेक' कमांड के लिए, सुनिश्चित करें कि आपके पास पायथन डीबग फाइलें स्थापित हैं (डेबियन पर अजगर-देव स्थापित करें, फेडोरा पर अजगर-डेवेल स्थापित करें)।

ध्यान दें कि टाइप परिभाषा के लिए संभव है, आपके मॉड्यूल को केवल अपने स्वयं के कार्यों को कॉल करना चाहिए। इस आशय को उदाहरण में इस तथ्य के कारण प्राप्त किया जाता है कि कॉल को __name __ == '__ main__' स्थिति के अंदर रखा जाता है, ताकि मॉड्यूल आयात होने पर उन्हें कॉल न किया जाए। फ़ंक्शंस को केवल अप्रत्यक्ष रूप से कहा जा सकता है, अर्थात यदि func2 कॉल func1, तो func1 कॉल को छोड़ा जा सकता है।

विस्तार मॉड्यूल को अब सामान्य रूप से आयात और उपयोग किया जा सकता है:

 >>> from simple_module import func1, func2 >>> func1(5) 6 >>> func2(10) {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81} 


प्रतिबंध


संकलित विस्तार मॉड्यूल और मूल का उपयोग करने के बीच महत्वपूर्ण अंतर हैं।

आप केवल निर्मित स्केलर प्रकार और कंटेनरों को स्थानांतरित कर सकते हैं (int, float, complex, bool, str, list, tuple, dict, set), साथ ही उपयोगकर्ता द्वारा परिभाषित कक्षाओं में से कोई भी और उदाहरण नहीं। उदाहरण के लिए, अनाम फ़ंक्शंस और पुनरावृत्तियाँ वर्तमान में समर्थित नहीं हैं।
इनलाइन ऑब्जेक्ट्स के साथ-साथ उनकी सामग्री पूरी तरह से हर फंक्शन कॉल में बदल जाती है / शेड स्किन टाइप्स से CPython में जाती है और इसके विपरीत। इसका मतलब यह है कि आप शेड स्किन साइड पर बिल्ट-इन CPython ऑब्जेक्ट को नहीं बदल सकते हैं और इसके विपरीत, और रूपांतरण धीमा हो सकता है। उपयोगकर्ता द्वारा परिभाषित कक्षाओं के उदाहरणों को किसी भी रूपांतरण के बिना स्थानांतरित किया जा सकता है / वापस लौटाया जा सकता है और किसी भी पक्ष में बदला जा सकता है।
ग्लोबल वेरिएबल्स को केवल एक बार, इनिशियलाइज़ेशन के दौरान, शेड स्किन से सीपीथॉन में परिवर्तित किया जाता है। इसका मतलब है कि सीपीथॉन संस्करण और शेड स्किन संस्करण स्वतंत्र रूप से बदल सकते हैं। केवल निरंतर गाबोला चर का उपयोग करके, या गटर और सेटर कार्यों को जोड़कर इस समस्या से बचा जा सकता है।
मल्टीपल (इंटरेक्टिंग) विस्तार मॉड्यूल वर्तमान में समर्थित नहीं हैं। इसके अलावा, पायथन और अनुवादित दोनों संस्करणों का एक ही समय में आयात करना और उपयोग करना संभव नहीं है।

Numpy के साथ एकीकरण


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

 # simple_module2.py def my_sum(a): """ compute sum of elements in list of lists (matrix) """ h = len(a) # number of rows in matrix w = len(a[0]) # number of columns s = 0.0 for i in range(h): for j in range(w): s += a[i][j] return s if __name__ == '__main__': print my_sum([[1.0, 2.0], [3.0, 4.0]]) 


शेड स्किन का उपयोग करके इस मॉड्यूल को एक्सटेंशन मॉड्यूल के रूप में अनुवाद करने के बाद, हम निम्नानुसार Numpy सरणी को पास कर सकते हैं:

 >>> import numpy >>> import simple_module2 >>> a = numpy.array(([1.0, 2.0], [3.0, 4.0])) >>> simple_module2.my_sum(a.tolist()) 10.0 


बाइनरी वितरण

विंडोज


किसी अन्य सिस्टम पर उत्पन्न विंडोज बाइनरी कोड का उपयोग करने के लिए या इसे init.bat के बिना चलाने के लिए, बाइनरी फ़ाइल के साथ निर्देशिका में निम्न फ़ाइलों को रखें:

shedskin-0.9 \ shedskin \ gc.dll
shedskin-0.9 \ shedskin-libpcre-0.dll
shedskin-0.9 \ bin \ libgcc_s_dw-1.dll
shedskin-0.9 \ bin \ libstdc ++। dll

यूनिक्स


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

 $ ldd test libgc.so.1 => /usr/lib/libgc.so.1 libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 $ cp /usr/lib/libgc.so.1 . $ cp /lib/x86_64-linux-gnu/libpcre.so.3 . $ LD_LIBRARY_PATH=. ./test 


ध्यान दें कि दोनों सिस्टम 32-बिट या 64-बिट होने चाहिए। यदि यह मामला नहीं है, तो बाइनरी के पुनर्निर्माण के लिए शेड स्किन को किसी अन्य सिस्टम पर स्थापित किया जाना चाहिए।

बहु



मान लीजिए कि हमने meuk.py नामक एक फ़ाइल में निम्नलिखित फ़ंक्शन को परिभाषित किया है:

 def part_sum(start, end): """ calculate partial sum """ sum = 0 for x in xrange(start, end): if x % 2 == 0: sum -= 1.0 / x else: sum += 1.0 / x return sum if __name__ == '__main__': part_sum(1, 10) 


एक्सटेंशन मॉड्यूल में इस फ़ाइल का अनुवाद करने के लिए:

  shedskin -e meuk make 


मानक मल्टीप्रोसेसिंग लाइब्रेरी के मॉड्यूल के साथ परिणामी विस्तार मॉड्यूल का उपयोग करने के लिए, बस पायथन में आवरण जोड़ें:

 from multiprocessing import Pool def part_sum((start, end)): import meuk return meuk.part_sum(start, end) pool = Pool(processes=2) print sum(pool.map(part_sum, [(1,10000000), (10000001, 20000000)])) 


C / C ++ कोड को कॉल करना



C / C ++ कोड लागू करने के लिए, निम्नलिखित करें:

C / C ++ कोड प्रकार मॉडल का उपयोग करके टाइपिंग जानकारी के साथ शेड स्किन प्रदान करें। मान लें कि हमें एक साधारण फ़ंक्शन को कॉल करने की आवश्यकता है जो किसी दिए गए संख्या से अधिक n सबसे छोटे primes की सूची देता है। निम्न प्रकार का मॉडल, जो कि स्टडफ़ॉक्स फ़ाइल में समाहित है, शेड स्किन के लिए पर्याप्त है ताकि टाइप मिलान किया जा सके:

 #stuff.py def more_primes(n, nr=10): return [1] 


वास्तविक प्रकार की मैपिंग करने के लिए, test.py नामक एक परीक्षण प्रोग्राम लिखें जो इस प्रकार के मॉडल का उपयोग करता है, और फिर इसका अनुवाद करें:

 #test.py import stuff print stuff.more_primes(100) shedskin test 


Test.py के अलावा, यह कोड भी C ++ में stuff.py का अनुवाद करता है। अब आप मैन्युअल रूप से C / C ++ कोड को stuff.cpp फ़ाइल में लिख सकते हैं। Test.py फ़ाइल के अगले अनुवाद के दौरान इसे अधिलेखित करने से बचने के लिए, सामान को स्थानांतरित करें।

मानक पुस्तकालय


सामान ले जाकर। * लिब / के लिए, हमने वास्तव में कस्टम लाइब्रेरी मॉड्यूल सपोर्ट को शेड स्किन में जोड़ा। शेड स्किन द्वारा प्रसारित अन्य कार्यक्रम अब हमारे पुस्तकालय को आयात कर सकते हैं और अधिक_प्रधान उपयोग कर सकते हैं। वास्तव में, lib / निर्देशिका में सभी समर्थित मॉड्यूल के प्रकार मॉडल और कार्यान्वयन शामिल हैं। जैसा कि आप देख सकते हैं, कुछ को शेड स्किन का उपयोग करके आंशिक रूप से C ++ में बदल दिया गया है।

शेड त्वचा के प्रकार


शेड स्किन, C ++ में अपनी कक्षाओं के एक सेट के साथ पायथन के अंतर्निहित प्रकारों को फिर से लागू कर रहा है। उनके पास अपने पायथन समकक्षों के समान इंटरफ़ेस है, इसलिए वे उपयोग करना आसान है (यह मानते हुए कि आपके पास मूल सी ++ ज्ञान है)। वर्ग परिभाषाओं की अधिक जानकारी के लिए lib / buildin.hpp फ़ाइल देखें। यदि संदेह है, तो समान पायथन कोड को C ++ में बदलें और परिणाम देखें!

कमांड लाइन विकल्प



शेडस्किन कमांड निम्नलिखित विकल्पों का समर्थन करता है:



उदाहरण के लिए, एक्सटेंशन मोड्यूल के रूप में test.py फ़ाइल का अनुवाद करने के लिए, shedskin –e परीक्षण या shedskin –extrood परीक्षण दर्ज करें।

-B या --nobounds विकल्प का अक्सर उपयोग किया जाता है क्योंकि यह आउट-ऑफ-रेंज अपवाद (IndexError) को निष्क्रिय करता है, जो प्रदर्शन को बहुत प्रभावित कर सकता है।

  a = [1, 2, 3] print a[5] # invalid index: out of bounds 


उत्पादकता युक्तियाँ और चालें


टिप्स


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

हालाँकि, ध्यान दें कि मुहावरेदार के लिए a, b in enumerate (..), a के लिए b, enumerate (..) में और a, के लिए somedict.iteritems () में b, मध्यवर्ती छोटी वस्तुओं को अनुकूलक, और लंबाई 1 की रेखाओं द्वारा फेंक दिया जाता है। कैश्ड हैं।

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

उत्पन्न कोड में एक विशेषता के माध्यम से पहुंच सूचकांक द्वारा लेने की तुलना में तेज है। उदाहरण के लिए, vx * vy * vz v [0] * v [1] * v [2] से तेज है।

शेड स्किन उन फ्लैगस * सी फाइलों से सी ++ कंपाइलर के लिए झंडे लेती है, जहां निर्देशिका में फाइलें स्थापित की जाती हैं। इन झंडों को FLAGS नामक स्थानीय फ़ाइल का उपयोग करके बदला या संशोधित किया जा सकता है।

बहुत से फ़्लोटिंग पॉइंट गणनाओं के साथ, IEEE फ़्लोटिंग पॉइंट विनिर्देशों का पालन करना हमेशा आवश्यक नहीं होता है। -Ffast-math फ्लैग को जोड़ने से प्रदर्शन में काफी सुधार हो सकता है।

प्रोफाइलिंग और भी अधिक प्रदर्शन को निचोड़ सकती है। जीसीसी के हाल के संस्करणों में, पहले-कोड को -fprofile-Generate के साथ संकलित और निष्पादित करें, और उसके बाद fprofile-use के साथ।

सर्वोत्तम परिणामों के लिए, CPPFLAGS = "- O3 -mar = देशी" का उपयोग करके Boehm GC के नवीनतम संस्करण को कॉन्फ़िगर करें ।/configure --enable-cplusplus --enable-threads = pthreads --enable-Thread-local-आवंटन --enable-large -कॉन्फ़िग - परमान-समानांतर-चिह्न। बाद वाला विकल्प जीसी को कई प्रोसेसर कोर का उपयोग करने की अनुमति देता है।

अनुकूलन करते समय, यह जानना बहुत उपयोगी है कि आपके कार्यक्रम के प्रत्येक भाग में कितना समय व्यतीत होता है। Gprof2Dot प्रोग्राम का उपयोग एक अलग प्रोग्राम और मूल पायथन कोड के लिए दोनों के लिए सुंदर ट्रैफ़िक बनाने के लिए किया जा सकता है। विस्तार मॉड्यूल को प्रोफाइल करने के लिए OProfile प्रोग्राम का उपयोग किया जा सकता है।

Gprof2dot का उपयोग करने के लिए, वेबसाइट से gprof2dot.py फ़ाइल डाउनलोड करें और ग्राफविज़ को स्थापित करें। तो:

 shedskin program make program_prof ./program_prof gprof program_prof | gprof2dot.py | dot -Tpng -ooutput.png 


OProfile का उपयोग करने के लिए, इसे स्थापित करें और निम्नानुसार उपयोग करें।

 shedskin -e extmod make sudo opcontrol --start python main_program_that_imports_extmod sudo opcontrol --shutdown opreport -l extmod.so 


स्वागत


निम्नलिखित दो कोड स्निपेट समान हैं, लेकिन केवल दूसरा ही समर्थित है:

 statistics = {'nodes': 28, 'solutions': set()} class statistics: pass s = statistics(); s.nodes = 28; s.solutions = set() 


जिस क्रम में फ़ंक्शन या प्रिंट स्टेटमेंट का तर्क सी ++ में अनुवादित होने पर परिवर्तनों का मूल्यांकन किया जाता है, इसलिए इस पर भरोसा नहीं करना सबसे अच्छा है:

 print 'hoei', raw_input() # raw_input    'hoei'! 


वर्तमान में विभिन्न तत्व प्रकार और लंबाई> 2 के साथ ट्यूपल समर्थित नहीं हैं। हालांकि, उनका अनुकरण किया जा सकता है:

 class mytuple: def __init__(self, a, b, c): self.a, self.b, self.c = a, b, c 


# {और #} से घिरे ब्लॉक टिप्पणियों को शेड स्किन द्वारा नजरअंदाज किया जाता है। इस सुविधा का उपयोग कोड पर टिप्पणी करने के लिए किया जा सकता है जिसे संकलित नहीं किया जा सकता है। उदाहरण के लिए, निम्नलिखित स्निपेट केवल CPython के तहत लॉन्च किए जाने पर एक बिंदु प्रदर्शित करता है:
 print "x =", x print "y =", y #{ import pylab as pl pl.plot(x, y) pl.show() #} 

संस्करण 0.9.4, 16 जून 2013, मार्क ड्यूफोर और जेम्स कफ़लान

Source: https://habr.com/ru/post/In194650/


All Articles