2012-06-09 24 views
5

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

तो मेरा सवाल मूल रूप से मेरे विकल्पों की एक स्पष्ट तस्वीर है जैसा कि मैंने नीचे उल्लिखित किया है, या क्या मैं गलत दिशा से यह आ रहा हूं?

  • PyPy के साथ चल रहा है: आज मैं PyPy के साथ प्रयोग शुरू कर दिया - परिणाम, रोमांचक हैं कि में मैं PyPy दुभाषिया से कोड के बड़े हिस्से को चला सकते हैं और मेरे पास कोई कोड में परिवर्तन के साथ 5x + गति सुधार दिखाई दे रहा है । हालांकि, अगर मैं सही ढंग से समझता हूं, (ए) wxpython समर्थन के साथ पापी still a work in progress है, और (बी) I cannot compile it down to an exe for distribution anyway। तो जब तक कि मैं गलत नहीं हूं, ऐसा लगता है कि यह मेरे लिए नहीं है? चीज़ों को पैकेज करने का कोई तरीका नहीं है इसलिए इसके कुछ हिस्सों को पिल्ला के साथ निष्पादित किया जाता है?
  • कोड को RPy के साथ अनुवादित करने के लिए कोड को कनवर्ट करना, तो अगला विकल्प वास्तव में कोड के हिस्सों को पिराई प्रतिबंधित भाषा में दोबारा लिखना प्रतीत होता है, जो एक बहुत बड़ी नौकरी की तरह लगता है। लेकिन अगर मैं ऐसा करता हूं, तो कोड के कुछ हिस्सों को निष्पादन योग्य (?) में संकलित किया जा सकता है और फिर मैं ctypes (?) के माध्यम से कोड तक पहुंच सकता हूं।
  • अन्य प्रतिबंधित विकल्प शेडस्किन यहां एक लोकप्रिय विकल्प प्रतीत होता है, क्या यह मेरी आवश्यकताओं को बेहतर बनाता है? अन्य विकल्प Cpython, Psyco, और Unladen प्रतीत होते हैं, लेकिन वे सभी को हटा दिया गया है या अब बनाए रखा नहीं है।

उत्तर

6

पीपीपी का उपयोग करके वास्तव में py2exe और इसी तरह के औजारों का नियम होता है, कम से कम जब तक कोई पोर्ट नहीं किया जाता है (AFAIK उस पर कोई सक्रिय कार्य नहीं है)। फिर भी, चूंकि पापी बाइनरी को स्थापित करने की आवश्यकता नहीं है, इसलिए आप एक अधिक जटिल वितरण से दूर हो सकते हैं जिसमें आपके पायथन स्रोत कोड और एक पाइप बाइनरी + स्टडीलिब शामिल है और लॉन्चिंग को आसान बनाने के लिए एक छोटे रैपर (बैच फ़ाइल, निष्पादन योग्य) का उपयोग करता है। मैं इस बात पर टिप्पणी नहीं कर सकता कि क्या पीपीपी पर डब्ल्यूएक्सपीथन का उपयोग करने के लिए काफी परिपक्व है, लेकिन संभवतया पाइप-देव, wxpython-dev या किसी के आईआरसी चैनल पर कोई व्यक्ति आपकी स्थिति का वर्णन करने पर सिफारिश दे सकता है।

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

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

+0

बहुत बहुत धन्यवाद, मैंने आपका जवाब स्वीकार कर लिया है। हालांकि, साइथन के साथ एक बहुत ही उत्पादक दोपहर के खेल के बाद, मुझे लगता है कि मैंने एक दुर्बल मुद्दा उठाया है: साइथन की थ्रेडिंग समर्थन की कमी। मेरी कम्प्यूटेशनल रूप से महंगा गणना, जो थ्रेड में भागने से पहले और जीयूआई को लॉक नहीं करती थी, अब सबकुछ फ्रीज करें। चारों ओर घूमने से, ऐसा लगता है कि यह डिज़ाइन द्वारा है; समांतरता प्राप्त करने के लिए (http://docs.cython.org/src/userguide/parallelism.html#parallel) जीआईएल को रिहा करना है, और जीआईएल में सभी कोड किसी भी मूल पायथन वस्तुओं का उपयोग नहीं कर सकते हैं, क्या मैं इसे सही ढंग से समझ रहा हूं? इससे साइथन कोई अच्छा नहीं होगा। – misshapen

+0

@NickJ (1) मुझे नहीं पता कि साइथन पाइथन धागे का समर्थन करता है - लेकिन मुझे नहीं लगता कि यह क्यों नहीं कर सका। हो सकता है कि आप जिस विकल्प से लिंक करते हैं वह बस * पसंदीदा * है, क्योंकि यह एकाधिक CPUs का उपयोग कर सकता है। (2) मुझे यकीन नहीं है कि यह आपके हिस्से पर एक टाइपो है, लेकिन जीआईएल * द्वारा संरक्षित कोड * पाइथन प्रकारों का उपयोग करने में सक्षम होगा, जबकि 'नोगिल' सेक्शन नहीं हो सकते हैं (क्योंकि सीपीथन, और इस प्रकार सभी पायथन प्रकार, भरोसा करते हैं जीआईएल)। (3) इसके अलावा, आप जो भी आप अपेक्षाकृत शुद्ध साइथन कार्यों में समानांतर करना चाहते हैं और पाइथन के माध्यम से धागे को लात मारकर साइथन में 'थ्रेडिंग' के बिना दूर हो सकते हैं। – delnan

3

मैं निश्चित रूप से साइथन में देखता हूं, मैं इसके साथ कुछ खेल रहा हूं और शुद्ध पायथन पर ~ 100x की गति को देखा है। पहली बार बाधाओं को खोजने के लिए प्रोफाइल मॉड्यूल का प्रयोग करें। आम तौर पर लूप्स साइथन जाने पर गति बढ़ाने की सबसे बड़ी संभावना है। आपको यह देखने में भी देखना चाहिए कि क्या आप लूप के बजाए न्यूम्पी में सरणी/वेक्टर ऑपरेशंस का उपयोग कर सकते हैं, यदि ऐसा है तो चरम प्रदर्शन को बढ़ावा भी दे सकता है।उदाहरण के लिए:

a = range(1000000) 
for i in range(len(a)): 
    a[i] += 5 

धीमी, वास्तविक धीमी है। दूसरी तरफ:

a = numpy.arange(10000000) 
a = a +5 

तेज, वास्तविक तेज़ है।

+0

+1 संख्याओं को यथासंभव numpy में स्थानांतरित करने के लिए +1। – huon

+0

इतनी बड़ी सरणी के लिए, एक + = 5 संभवतः तेज़ भी है – Dhara

0

सुधार: शेडस्किन का उपयोग विस्तार मॉड्यूल, साथ ही साथ पूरे कार्यक्रमों को उत्पन्न करने के लिए किया जा सकता है।