2010-11-15 14 views
25

के साथ गैर-तुच्छ पाइथन अनुप्रयोगों को अनुकूलित करने पर ट्यूटोरियल पाइथन समुदाय ने उपयोगी संदर्भ सामग्री प्रकाशित की है जिसमें दिखाया गया है कि पाइथन कोड कैसे दर्ज करें, और सी में पाइथन एक्सटेंशन के तकनीकी विवरण या Cython में। मैं अभी भी ट्यूटोरियल जो दिखाने के लिए तलाश कर रहा हूँ, हालांकि, गैर तुच्छ अजगर कार्यक्रमों के लिए, निम्न करें:सी एक्सटेंशन या साइथन

  1. बस के रूप में महत्वपूर्ण बात यह एक सी विस्तार
  2. के लिए रूपांतरण द्वारा हॉटस्पॉट जो अनुकूलन से लाभ होगा पहचान करने के लिए कैसे, हॉटस्पॉट की पहचान कैसे करें रूपांतरण से सी एक्सटेंशन
  3. अंत में, पाइथन सी से एपीआई या शायद (अधिमानतः) सिथॉन का उपयोग करके उचित रूपांतरण कैसे करें।

एक अच्छा ट्यूटोरियल एक पूर्ण उदाहरण के माध्यम से काम करके ऑप्टिमाइज़ेशन की समस्या के माध्यम से कारणों के बारे में एक पद्धति के साथ पाठक प्रदान करेगा। मुझे इस तरह के संसाधन खोजने में कोई सफलता नहीं मिली है।

क्या आप इस तरह के एक ट्यूटोरियल के बारे में जानते हैं (या आपने लिखा है)?

  • परिचालन समय
  • को मापने के लिए प्रोफाइल की जांच करने के उपकरण का उपयोग अजगर कोड प्रोफ़ाइल का उपयोग करना (ग) प्रोफाइल:

    स्पष्टीकरण के लिए, मैं ट्यूटोरियल है कि कवर केवल निम्नलिखित में कोई दिलचस्पी नहीं हूँ (मैं RunSnakeRun)

  • अधिक उपयुक्त एल्गोरिदम या पायथन संरचनाओं का चयन करके अनुकूलित करना (उदाहरण के लिए, सूचियों के बजाय सदस्यता परीक्षण के लिए सेट); ट्यूटोरियल को एल्गोरिदम मानना ​​चाहिए और पायथन कोड पहले से ही इष्टतम है, और हम एक बिंदु पर हैं जहां सी एक्सटेंशन अगले लॉजिकल चरण
  • Python documentation on writing C extensions को दोबारा जोड़ना, जो संदर्भ के रूप में पहले से ही उत्कृष्ट है लेकिन दिखाने के लिए संसाधन के रूप में उपयोगी नहीं है कब और कैसे अजगर से सी को स्थानांतरित करने के लिए

उत्तर

6

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

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

उम्मीद है कि इससे मदद मिलती है।

+1

+1 वास्तव में एक ट्यूटोरियल को इंगित करने के लिए +1 –

+0

आम तौर पर मुझे जेरेमी जोन्स के पायथन लेख पसंद हैं, लेकिन यह एक अपेक्षाकृत कमजोर था। जैसा कि आपने बताया है, यह केवल एल्गोरिदम को प्रोफाइलिंग और अनुकूलित करने पर चर्चा करता है, और एक्सटेंशन को लिखकर ऑप्टिमाइज़ करने का अगला चरण नहीं लेता है। साथ ही, मेरा मानना ​​है कि 'हॉटशॉट' मॉड्यूल को बहिष्कृत किया गया है, क्योंकि इसे पायथन 3 में मानक लाइब्रेरी से हटा दिया गया था; इसके बजाय 'cprofile' का उपयोग किया जाना चाहिए। – gotgenes

4

अंक 1 और 2 के लिए, मैं एक पायथन प्रोफाइलर का उपयोग करूंगा, उदाहरण के लिए cProfile। त्वरित ट्यूटोरियल के लिए here देखें।

यदि आपके पास पहले से ही मौजूदा पायथन प्रोग्राम है, तो बिंदु 3 के लिए आप Cython का उपयोग करने पर विचार करना चाहेंगे। बेशक, सी में पुनः लिखने के बजाय, आप एक एल्गोरिदमिक सुधार को सोचने में सक्षम हो सकते हैं जो निष्पादन गति को बढ़ाएगा।

+0

क्या आप एक ट्यूटोरियल की सिफारिश कर सकते हैं कि एक शुद्ध-पायथन कार्यक्रम को अनुकूलित करने के लिए साइथन में इसे फिर से लिखना (भागों) कैसे किया जा सकता है? – gotgenes

9

अंक 1 और 2 अंगूठे का मूल अनुकूलन नियम हैं। यदि आप कहीं भी ट्यूटोरियल ढूंढ रहे हैं तो मैं बहुत आश्चर्यचकित हूं। शायद यही कारण है कि आपको एक नहीं मिला है। मेरे संक्षिप्त सूची:

  • नियम संख्या अनुकूलन में से एक है नहीं है।
  • नियम संख्या दो उपाय
  • नियम संख्या तीन सीमित कारक पहचान (अगर यह आईओ या डेटाबेस है ही, कोई अनुकूलन वैसे भी पहुंचा जा सकता हो सकता है)।
  • नियम संख्या चार लगता, बेहतर एल्गोरिदम और डेटा संरचना ...
  • भाषा का एक परिवर्तन पर विचार सूची में काफी कम है का उपयोग है ...

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

वास्तव में यह एक दुर्लभ कॉलिंग कोड है जिसे पायथन से प्राथमिक लक्ष्य के रूप में दिमाग में प्रदर्शन के साथ किया जाता है। अधिकतर लक्ष्य कुछ मौजूदा सी कोड के साथ पाइथन इंटरफ़ेस करना है।

और जैसा कि एक अन्य पोस्टर ने कहा, आपको शायद साइथन का उपयोग करने की बेहतर सलाह दी जाएगी।

आप अभी भी अजगर के लिए एक सी मॉड्यूल लिखने के लिए चाहते हैं, सभी आवश्यक official documentation.

+0

मैं जोड़ूंगा कि आप कुछ कार्यों के लिए SWIG या बूस्ट :: पायथन चाहते हैं। –

+1

भाषाओं से पहले एल्गोरिदम के लिए +1। और विचार करने के लिए जहां सी चमकता है - कसकर लूप में सरल, निम्न स्तर की डेटा संरचनाओं में हेरफेर – tobyodavies

2

मैं अपने अंक 1 और 2, और अपने पहले 3 बुलेट बिंदुओं को संबोधित करने की कोशिश करेंगे, लेकिन क्रम में नहीं है।

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

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

बिंदु 2 के संबंध में, कोई भी कोड जो ढेर के नमूनों के स्वस्थ प्रतिशत पर प्रकट नहीं होता है, या जो I/O जैसे सी में परिवर्तित होने से स्पष्ट रूप से लाभ नहीं उठाएगा।

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

मैं इसी तरह की परिस्थितियों में किया गया है, नहीं अजगर और C के बीच है, लेकिन सी और हार्डवेयर के बीच छोड़कर। **

बस एक उदाहरण है, तो कुल चालू अवधि 10 सेकंड है देने के लिए, और कलन विधि पर है लगभग 50% समय ढेर, तो यह लगभग 10 सेकंड में से 5 के लिए ज़िम्मेदार है। यदि एल्गोरिदम को सी में कनवर्ट करना 10x स्पीडअप देगा, तो वह 5 सेकंड 0.5 सेकंड तक घट जाएगा, इसलिए कुल समय 5.5 सेकंड तक घट जाएगा। (काफी हद तक - समय में कमी से पहले यह जानना ज़रूरी है कि यह कितना बड़ा होगा।) इस बिंदु पर, पूरी प्रक्रिया को दोहराया जा सकता है, और सी को कुछ और रूपांतरित करने के लिए यह समझ में आ सकता है। जब आप नमूने दिखाते हैं कि पाइथन कोड यह अच्छा कर रहा है, तो यह प्रक्रिया रोक सकती है, और सी कोड यह कर रहा है कि यह क्या अच्छा है।

** उदा। फ़्लोटिंग-पॉइंट गणित, लाइब्रेरी बनाम चिप, या ग्राफिक्स, पाठ & बहुभुज ड्राइंग।

संबंधित मुद्दे