मैं प्रदर्शन समस्याओं के कारण साइथन सीखना शुरू कर रहा हूं। यह विशेष कोड परिवहन मॉडलिंग (नियोजन के लिए) क्षेत्र में कुछ नए एल्गोरिदम लागू करने का प्रयास है।पाइथन की तुलना में साइथन में यह कोड धीमा क्यों है?
मैंने एक बहुत ही सरल कार्य शुरू करने का फैसला किया कि मैं एक बहुत (लाखों बार सैकड़ों) का उपयोग करूंगा और निश्चित रूप से प्रदर्शन में वृद्धि से लाभान्वित होगा।
मैं तीन अलग अलग तरीकों से इस समारोह को लागू किया और उन्हें 10 लाख बार प्रत्येक के लिए एक ही पैरामीटर (सरलता के लिए) के लिए परीक्षण किया:
एक cython मॉड्यूल में- Cython कोड। रनिंग समय: 3.35s
- साइथन मॉड्यूल में पायथन कोड। चलने का समय: 4.88s
मुख्य लिपि पर पायथन कोड। चलने का समय: 2.98s
जैसा कि आप देख सकते हैं, साइथन कोड साइथन मॉड्यूल में पायथन कोड से 45% धीमी थी और मुख्य स्क्रिप्ट पर लिखे गए कोड से 64% धीमी थी। वो कैसे संभव है? मैं गलती कहां कर रहा हूँ?
cython कोड यह है:
def BPR2(vol, cap, al, be):
con=al*pow(vol/cap,be)
return con
def func (float volume, float capacity,float alfa,float beta):
cdef float congest
congest=alfa*pow(volume/capacity,beta)
return congest
और परीक्षण के लिए स्क्रिप्ट यह है:
agora=clock()
for i in range(10000000):
q=linkdelay.BPR2(10,5,0.15,4)
agora=clock()-agora
print agora
agora=clock()
for i in range(10000000):
q=linkdelay.func(10,5,0.15,4)
agora=clock()-agora
print agora
agora=clock()
for i in range(10000000):
q=0.15*pow(10/5,4)
agora=clock()-agora
print agora
मैं (शक्ति) धीमी ट्रान्सेंडैंटल कार्यों जैसे मुद्दों के बारे में पता किया जा रहा हूँ, लेकिन मुझे नहीं लगता कि यह एक समस्या होनी चाहिए।
चूंकि फ़ंक्शन स्पेस पर फ़ंक्शन की तलाश करने के लिए ओवरहेड है, तो क्या यह कार्यक्षमता में मदद करेगा यदि मैंने फ़ंक्शन के लिए सरणी पास की है और सरणी वापस ले ली है? क्या मैं साइथन में लिखे गए फ़ंक्शन का उपयोग कर सरणी वापस कर सकता हूं?
संदर्भ के लिए, मैं उपयोग कर रहा हूँ: - विंडोज 7 64bits - अजगर 2.7.3 64 बिट्स - Cython 0.16 64 बिट्स - विंडोज विजुअल स्टूडियो 2008
तो, यदि आप फ़ंक्शन में सरणी पास करने के बारे में सोच रहे हैं, तो संभवतः आप कोड को वेक्टरिज़ कर सकते हैं, इस मामले में आपने क्या किया है आप बस [NumPy] (http://numpy.scipy.org/) के साथ क्या करने की कोशिश कर रहे हैं? निश्चित रूप से, आपके उदाहरण में फ़ंक्शन को NumPy का उपयोग करके सरणी पर कार्यान्वित किया जा सकता है। –
वैसे यह एक बेहद मामूली फ़ंक्शन है और साइथन को 'PyObject *' को एक फ्लोट में परिवर्तित करना होगा और फिर वापस नहीं है? इस तरह के एक छोटे से काम के लिए बहुत अधिक उपर की तरह लगता है। – Voo
बस स्पष्ट करने के लिए, आपकी समस्या यह है कि आप अपना अधिकांश समय फ़ंक्शन को कॉल करने में व्यतीत कर रहे हैं, जो साइथन का उपयोग करके बेहतर नहीं होता है। मेरा सुझाव है कि आप समाधान (साइथन) का पूर्वाग्रह किए बिना अपने प्रश्न को दोहराएं। इस तरह जो उत्तर देने के लिए नहीं हैं उनके साथ काम करने के लिए और अधिक होगा। वास्तव में कोड का उपयोग करने का एक छोटा सा उदाहरण उपयोगी होगा। –