मैं आपके प्रश्न का उत्तर देने का प्रयास करूंगा कि आप विशेष रूप से अजगर के लिए पूछ रहे हैं। मैं एक सिमुलेशन समस्या से निपटने के अपने तरीके का वर्णन करूंगा। इस विवरण में तेज सिमुलेशन की रणनीतियाँ दी गई हैं।
सबसे पहले, मैंने पायथन में नए सिमुलेशन का प्रोटोटाइप बनाया। बेशक, मैं जितना संभव हो उतना NumPy और SciPy का उपयोग करने की कोशिश करता हूं। जहाँ NumPy संख्यात्मक सिमुलेशन के लिए एक उपयुक्त सरणी डेटा प्रकार प्रदान करता है, SciPy NumPy सरणियों के साथ काम करने के लिए एक विस्तृत संख्यात्मक दिनचर्या प्रदान करता है।
एक बार जब प्रोटोटाइप अधिक या कम काम करता है, तो मैं यह जानने की कोशिश करता हूं कि कार्यक्रम या स्क्रिप्ट के कौन से हिस्से अड़चन हैं। उसके लिए विशिष्ट उम्मीदवार हैं:
- अजगर में लूप्स धीमे होते हैं। बहुत धीमी गति से।
- जैसा कि पायथन डक टाइपिंग का उपयोग करता है , कॉलिंग फ़ंक्शन धीमा हो सकता है।
मैं यह जानने के लिए एक सरल रूपरेखा रणनीति का उपयोग करता हूं कि सभी रन समय कहां खर्च होता है। IPython शेल का उपयोग करना (जो मैं पर्याप्त अनुशंसा नहीं कर सकता), मैं अपनी स्क्रिप्ट चलाता हूं
%timeit script.py
यह "मैजिक कमांड" आपके लिए प्रोफाइलिंग ( समयसीमा का उपयोग ) करेगा और आपकी स्क्रिप्ट समाप्त होने के बाद आपको कई बार एक सूची पेश करेगा। यह पता लगाने के लिए कि आपका कोड बहुत धीमा है, इस सूची का उपयोग करें।
एक बार जब आप उन हिस्सों को नीचे कर लेते हैं जिन्हें गति देने की आवश्यकता होती है, तो आप संकलित भाषाओं का उपयोग करने पर विचार कर सकते हैं। मैं दो समाधानों की ओर इशारा करूंगा।
सबसे पहले, साइथन भाषा है। साइथन एक प्रोग्रामिंग लैंग्वेज है जो पायथन के समान है (वास्तव में, पायथन कोड अक्सर मान्य पायथन कोड है, भी); हालाँकि, Cython संकलक Cython फ़ाइलों को C कोड में बदल देता है, जिसे बाद में Python से उपयोग किए जा सकने वाले मॉड्यूल में संकलित किया जा सकता है। सिथॉन न्यूमपी सरणियों को समझता है। साइथॉन का उपयोग करने के दो तरीके हैं जो आपकी मदद कर सकते हैं: पहला, आप डेटा प्रकार पेश कर सकते हैं। यह फ़ंक्शन कॉल को गति देगा। इसके अलावा, यदि आप सरणियों पर पुनरावृत्ति करते हैं, तो आपका लूप तेजी से चलेगा (वास्तव में, यदि आप डमी चर और सरणी दोनों टाइप करते हैं, तो आपको एक सादा लूप मिलता है!)। दूसरे, मेरे प्रयोगों में भी अनकही स्क्रिप्ट इस तथ्य के कारण थोड़ी तेज चलती हैं कि वे व्याख्या के बजाय संकलित हैं।
अन्य संकलित भाषा जो आपके लिए उपयोगी होगी, वह फोरट्रान है। वहाँ अजगर (साथ फोरट्रान उपयोग करने के लिए विभिन्न तरीके हैं f2py , fortwrap , Cython )। जैसा कि मुझे व्यक्तिगत रूप से f2py सबसे आसान तरीका लगता है, मैं जल्दी से इसका वर्णन करता हूं कि यह क्या करता है। f2py फ़ोर्टन कोड को पायथन मॉड्यूल के लिए संकलित कर सकता है। यह आपको पायथन स्पेस से इनपुट और आउटपुट वेरिएबल के रूप में NumPy सरणियों का उपयोग करने की अनुमति देगा। फोरट्रान अंतरिक्ष में, ये साधारण फोरट्रान सरणियाँ होंगी। आप उन पर पूर्ण फोरट्रान गति से काम कर सकते हैं।
व्यक्तिगत रूप से, मैं साइथन का उपयोग करता हूं जहां फ़ंक्शन कॉल की संख्या अड़चन है। लूप-हैवी सामान के लिए, मैं f2py पसंद करता हूं (हो सकता है क्योंकि मेरे पास एक मजबूत फोरट्रान पृष्ठभूमि है)।
फोरट्रान पर अतिरिक्त ध्यान देने पर: आधुनिक फोरट्रान न्यूमपी के समान ही पढ़ता और लिखता है - वाक्य रचना बहुत करीब है। इससे NumPy कोड को Fortran कोड में बदलना आसान हो जाता है।
ध्यान दें कि साइथॉन और f2py दोनों किसी तरह समानतावाद का समर्थन करते हैं। साइथन के लिए, आपको यहां मदद मिलेगी , जबकि फोरट्रान के लिए, ओपनएमपी या एमपीआई जैसी मानक तकनीकें हैं । इसके अलावा, MPI के लिए P ython रैपर भी हैं। व्यक्तिगत रूप से, मैं Python स्तर पर और साथ ही Fortran में OpenMP पर mpi4py का उपयोग करता हूं।
मुझे थोड़ा साहित्य की सिफारिश करने के लिए: पुस्तक पायथन स्क्रिप्टिंग फॉर कम्प्यूटेशनल साइंस द्वारा एच.-पी.पी. लैंगटैंगेन पायथन पर एक महान संसाधन है और साथ ही पायथन को थोड़ा तेज करने की रणनीतियों पर। दुर्भाग्य से, AFAIR, यह साइथन पर कुछ भी उल्लेख नहीं करता है। जैसा कि मैंने दूसरा संसाधन आप इन स्लाइड्स को देख सकते हैं । मैं इस पोस्ट में बताई गई हर चीज के लिए उदाहरण देता हूं ( यहां कोड और स्रोत भी देखें )। इंटरनेट पर स्लाइड के कई अन्य अच्छे सेट हैं।
यदि आपके पास अधिक विशिष्ट प्रश्न हैं, तो हम मदद करने में प्रसन्न हैं!