मैं इस सिद्धांत के तहत परिचालन कर रहा हूं कि जनरेटर अभिव्यक्ति सामान्य लूप की तुलना में अधिक कुशल होती है। लेकिन फिर मैंने निम्नलिखित उदाहरण में भाग लिया: एक संख्या लिखें, N
, और कुछ कारक, ps
, N
के तहत सभी संख्याओं का योग देता है जो कम से कम एक कारक हैं।यह जेनरेटर अभिव्यक्ति लूप संस्करण की तुलना में धीमी गति से क्यों काम करती है?
def loops(N, ps):
total_sum = 0
for i in xrange(N):
for p in ps:
if i%p == 0:
total_sum += i
break
return total_sum
def genexp(N, ps):
return sum(i for i in xrange(N)
if any(i%p == 0 for p in ps))
मैं एक छोटे से तेजी से हो सकता है समझ संस्करण के साथ, लगभग बराबर प्रदर्शन करने के लिए दो उम्मीद थी, लेकिन मैं उम्मीद नहीं थी क्या:
यहाँ एक पाश संस्करण और एक छोटी जनरेटर अभिव्यक्ति संस्करण है यह था:
for func in ('loops', 'genexp'):
print func, timeit.timeit('%s(100000, [3,5,7])' % func,
number=100,
setup='from __main__ import %s' % func)
loops 2.82878184319
genexp 10.1663100719
4x धीमी भी करीब नहीं है! क्यूं कर? मैं गलतफहमी क्या कर रहा हूं?
आपके पास जनरेटर अभिव्यक्ति * है, सूची की समझ नहीं है। –
@MartijnPieters धन्यवाद! स्पष्ट रूप से मैं एक अजगर आदमी नहीं हूँ :) – Barry