पायथन में लिखे कोड को गति देने के लिए कौन से उपकरण या दृष्टिकोण उपलब्ध हैं?


29

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

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

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


मैंने इस प्रश्न का एक पायथन- सेक्शुअल उत्तर दिया: scicomp.stackexchange.com/questions/2429/… मुझे लगता है कि वहाँ के संकेत और लिंक आपके लिए मददगार होंगे।
अलेक्सई

(h / t to @AlexE मुझे इससे अवगत कराने के लिए) इस सवाल के बीच निश्चित रूप से ओवरलैप है, (कैसे) तेजी से चलने वाले सिमुलेशन लिखें? , और मेरे कोड के धारावाहिक प्रदर्शन में सुधार के लिए कुछ अच्छी रणनीतियाँ क्या हैं? । किसी प्रकार का मर्ज क्रम में हो सकता है। मैंने इसके बारे में मेटा पर पोस्ट किया है।
ज्योफ ऑक्सबेरी

1
यहां अच्छे उत्तरों के अलावा, इस लिंक पर एक नज़र डालें ।
माइक डनलैवी

जवाबों:


40

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

यदि आप वास्तव में केवल मैट- वीसी उत्पादों में रुचि रखते हैं, तो मैं scipy.sparse की सिफारिश करूंगा

प्रोफाइलिंग के लिए पायथन उपकरण

प्रोफ़ाइल और cProfile मॉड्यूल : ये मॉड्यूल आपको अपने मानक रन टाइम विश्लेषण और फ़ंक्शन कॉल स्टैक देंगे। उनके आँकड़ों को सहेजना बहुत अच्छा है और pstats मॉड्यूल का उपयोग करके आप डेटा को कई तरीकों से देख सकते हैं।

kernitable : यह उपकरण लाइन कोड टाइमिंग द्वारा लाइन जैसे काम करने के लिए कई रूटीनों को एक साथ रखता है

memory_profiler : यह टूल आपके कोड की लाइन मेमोरी फुट प्रिंट द्वारा लाइन का उत्पादन करता है।

IPython टाइमर :timeitफंक्शन एक त्वरित इंटरैक्टिव तरीके से कार्यों में अंतर देखने के लिए काफी अच्छा है।

पायथन को गति दे रहा है

Cython : cython अजगर में कुछ कार्यों लेने के लिए और तेजी से कोड प्राप्त करने के तेज़ तरीका है। आप अजगर के साइथन संस्करण के साथ फ़ंक्शन को सजा सकते हैं और यह सी कोड उत्पन्न करता है। यह बहुत मुख्य है और सी / सी ++ / फोरट्रान में आसानी से लिखे गए अन्य हाथ से लिंक भी कर सकता है। यह आज तक पसंदीदा उपकरण है।

ctypes : ctypes आपको अपने कार्यों को c में लिखने की अनुमति देगा और फिर कोड की अपनी सरल सजावट के साथ उन्हें जल्दी से लपेट देगा। यह PyObjects से कास्टिंग के सभी दर्द को संभालता है और c को फ़ंक्शन को कॉल करने के लिए gil को प्रबंधित करता है।

C में अपना कोड लिखने के लिए अन्य दृष्टिकोण मौजूद हैं, लेकिन वे C / C ++ लाइब्रेरी को लेने और इसे पायथन में लपेटने के लिए कुछ हद तक अधिक हैं।

पायथन-केवल दृष्टिकोण

यदि आप ज्यादातर पायथन के अंदर रहना चाहते हैं, तो मेरी सलाह है कि आप अपने एल्गोरिदम को लागू करने के लिए सही डेटा प्रकारों का उपयोग कर रहे हैं। यह मेरा अनुभव रहा है कि आप आमतौर पर अपने डेटा संरचनाओं को अनुकूलित करके बहुत दूर हो जाएंगे, फिर किसी भी निम्न स्तर के सी हैक। उदाहरण के लिए:

सुन्न : सरणियों के तार संचालन के लिए एक आकस्मिक सरणी बहुत तेज़ है

numexpr : a numpy array अभिव्यक्ति optimizer। यह मल्टीप्रीज़िंग एफ़पीई एक्सप्रेशन के लिए अनुमति देता है और कई टेम्पोररी से भी छुटकारा दिलाता है, जो कि पाइथन शेप्टर के प्रतिबंधों के कारण खस्ता हो जाता है।

ब्लिस्टर : किसी सूची का बी-ट्री कार्यान्वयन, किसी सूची के आंतरिक नोड्स को सम्मिलित करने, अनुक्रमित करने और स्थानांतरित करने के लिए बहुत तेज़

पांडा : डेटा फ़्रेम (या टेबल) सरणियों पर बहुत तेज़ विश्लेषिकी।

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


3
आप फोरट्रान दिनचर्या को भी कॉल करने के लिए ctypes का उपयोग कर सकते हैं।
मैथ्यू एम्मट


रैपिंग कोड के बारे में बात करते हुए, f2py के बारे में क्या?
एस्ट्रोजूनलू

f2py एक महान उपकरण है और समुदाय में कई लोगों द्वारा उपयोग किया जाता है। fwrap एक अधिक हालिया प्रतिस्थापन है क्योंकि f2py इसकी आयु दर्शाता है लेकिन वास्तव में यह पूर्ण नहीं है।
अपरेल

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

7

सबसे पहले, अगर कोई C या फोरट्रान कार्यान्वयन उपलब्ध है (MATLAB MEX फ़ंक्शन?), तो आप पायथन आवरण क्यों नहीं लिखते हैं?

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

सौभाग्य।


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

मैं वास्तव में सुन्न को नजरअंदाज कर दिया। सुन्न के साथ एक ही लैप्लस बेंचमार्क चलाना अच्छा होगा ...
GertVdE

है scipy.weaveअभी भी प्रयोग किया और विकसित किया? ऐसा लगता है कि प्रदर्शन पायथन लेख से पता चलता है कि यह उपयोग करने के लिए तेज़ हो सकता है और गति पर बहुत अच्छा सुधार देता है लेकिन मैंने शायद ही कभी इसे उस लेख के बाहर उल्लेख किया है।
केन

@Ken: scipy.weave, जहां तक ​​मुझे पता है, अब सक्रिय विकास के तहत नहीं है। इसे पिछड़ी अनुकूलता के लिए रखा गया है लेकिन नई परियोजनाओं को साइथन का उपयोग करने के लिए प्रोत्साहित किया जाता है।
GertVdE

GotoBLAS और NumPy / SciPy के लिए, der-schnorz.de/2012/06/optimized-linear-algebra-and-numpyscipy
AlexE

4

मूल रूप से मैं अन्य उत्तरों से सहमत हूं। शीघ्र संख्यात्मक- pythonकोड के लिए सबसे अच्छा विकल्प हैं

  • जैसे विशेष पुस्तकालयों का उपयोग करें numpy
  • अपने मौजूदा कोड को लपेटें ताकि आपका python-प्रोग्राम इसे सीधे कॉल कर सके

लेकिन अगर आप स्क्रैच से पूरे एल्गोरिथ्म को प्रोग्राम करना चाहते हैं (मैं बोली: "मैं केवल कच्चे पायथन का उपयोग करता हूं") तो आप http://pypy.org/ JIT (जस्ट इन टाइम) के कार्यान्वयन पर विचार करना चाह सकते हैं python। मैं इसे अपनी परियोजना के लिए उपयोग करने में सक्षम नहीं हुआ (क्योंकि यह निर्भर करता है numpyऔर pypyलोग स्पष्ट रूप से उस समर्थन पर काम कर रहे हैं) लेकिन बेंचमार्क काफी प्रभावशाली हैं ( http://speed.pypy.org/ )


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