पर लूपिंग पर ओवरहेड मैं पाइथन के जेनरेटर और इटेरिएबल क्लास के साथ बस मस्ती के लिए झुका रहा था। असल में मैं कुछ ऐसा परीक्षण करना चाहता था जिसे मैंने कभी भी इस बारे में निश्चित नहीं किया है: कि पाइथन में कक्षाओं में कुछ महत्वपूर्ण ओवरहेड है और यदि आप कर सकते हैं तो एक वर्गर प्रोटोकॉल को लागू करने वाले वर्गों के बजाय yield
लागू करने वाले तरीकों पर भरोसा करना बेहतर है।पायथन - एक पुनरावर्तक वर्ग
मैं गूगल में इस विषय पर एक संतोषजनक स्पष्टीकरण नहीं मिला, तो मैं इन दो सरल स्क्रिप्ट का उपयोग कर अपने दम पर उन्हें बाहर परीक्षण करने का फैसला: func_iter.py
और class_iter.py
यहाँ func_iter.py
है:
#!/usr/bin/env python
import time
x = 0
def create_generator(num):
mylist = range(num)
for i in mylist:
yield i
t = time.time()
gen = create_generator(100000)
for i in gen:
x = x + i
print "%.3f" % (time.time() - t)
और यहाँ class_iter.py
है: थी का उपयोग कर 10 बार
#!/usr/bin/env python
import time
x = 0
class Generator(object):
def __init__(self, num):
self.start = 0
self.end = num
def __iter__(self):
return self
def next(self):
if self.start == self.end:
raise StopIteration
else:
self.start = self.start + 1
return self.start
t = time.time()
gen = Generator(100000)
for i in gen:
x = x + i
print "%.3f" % (time.time() - t)
मैं तो उनमें से प्रत्येक भाग गया बैश में (class_iter.py
के लिए, उदाहरण के लिए):
for i in {1..10}; do ./class_iter.py; done
और यहाँ उनमें से प्रत्येक के लिए औसत चल रहा समय है:
class_iter.py: 0.0864
func_iter.py: 0.0307
अब, मेरे सवाल कर रहे हैं:
- हैं मेरी विधियां सही हैं? क्या मेरी तुलना मेला है?
- यदि हां, तो बड़ा अंतर क्यों?
class_iter.py
को चलाने के लिएfunc_iter.py
तक लगभग तीन बार क्यों लिया गया? - यदि नहीं, तो मैं अपनी विधियों को कैसे सुधार सकता हूं या बेहतर तुलना के साथ आ सकता हूं?
संपादित करें: जैसा कि Dacav का सुझाव दिया, मैं भी xrange
range
के बजाय का उपयोग कर func_iter.py
चल कोशिश की। यह औसत औसत समय 0.0263 सेकंड तक घटता है।
मुझे नहीं लगता कि वह यही परीक्षण करना चाहता था। आप जेनरेटर की तुलना यहां जेनरेटर से कर रहे हैं, न कि इटरेटर प्रोटोकॉल के जनरेटर। हां, कक्षा अभी भी पुनरावर्तनीय है, लेकिन (उदाहरण के लिए) आप इसे राज्य नहीं चुन सकते हैं क्योंकि राज्य एक जनरेटर है जो कक्षा का सदस्य नहीं है। – agf
पुष्टि की! यह अभी भी 0.002 सेकेंड के लिए धीमा है ~ क्या यह मानना सुरक्षित है कि यह अंतर कक्षा के तत्काल होने के समय के कारण होता है? – bow
@bow: हाँ, कक्षा तत्काल + '__iter__' में आवृत्ति चर का उपयोग। यदि आप दृश्यों के पीछे क्या चल रहा है यह देखने के लिए उत्सुक हैं, तो 'डी' मॉड्यूल आज़माएं। – georg