मुझे लगता है कि अन्य उत्तरों की तुलना में यहां उत्तर थोड़ा अधिक सूक्ष्म है, हालांकि इसका सार सही है: लूप के लिए तेजी से है क्योंकि अधिक संचालन सी में होता है और पायथन में कम होता है ।
विशेष रूप से, लूप केस के लिए, C में दो चीजें होती हैं, जबकि लूप को पायथन में संभाला जाता है:
जबकि लूप में, तुलना i < 100000000
को पायथन में निष्पादित किया जाता है, जबकि लूप के लिए, जॉब को range(100000000)
पुनरावृत्ति के लिए पारित किया जाता है , जो आंतरिक रूप से सी में पुनरावृत्ति (और इसलिए सीमा की जांच) करता है।
लूप में लूप अपडेट i += 1
, पायथन में होता है, जबकि लूप के लिए फिर से पुनरावृति का range(100000000)
सी, सी में लिखा i+=1
(या ++i
) करता है।
हम देख सकते हैं कि यह इन दोनों चीजों का एक संयोजन है जो अंतर को देखने के लिए मैन्युअल रूप से जोड़कर लूप के लिए तेजी से बनाता है।
import timeit
N = 100000000
def while_loop():
i = 0
while i < N:
i += 1
def for_loop_pure():
for i in range(N):
pass
def for_loop_with_increment():
for i in range(N):
i += 1
def for_loop_with_test():
for i in range(N):
if i < N: pass
def for_loop_with_increment_and_test():
for i in range(N):
if i < N: pass
i += 1
def main():
print('while loop\t\t', timeit.timeit(while_loop, number=1))
print('for pure\t\t', timeit.timeit(for_loop_pure, number=1))
print('for inc\t\t\t', timeit.timeit(for_loop_with_increment, number=1))
print('for test\t\t', timeit.timeit(for_loop_with_test, number=1))
print('for inc+test\t', timeit.timeit(for_loop_with_increment_and_test, number=1))
if __name__ == '__main__':
main()
मैंने दोनों को 100000000 की संख्या के साथ शाब्दिक स्थिर बनाने की कोशिश की और इसके साथ एक चर के N
रूप में अधिक विशिष्ट होगा।
while loop 3.5131139
for pure 1.3211338000000001
for inc 3.5477727000000003
for test 2.5209639
for inc+test 4.697028999999999
while loop 4.1298240999999996
for pure 1.3526357999999998
for inc 3.6060175
for test 3.1093069
for inc+test 5.4753364
जैसा कि आप देख सकते हैं, दोनों मामलों में, while
समय के अंतर के बहुत करीब है for inc+test
और for pure
। यह भी ध्यान दें कि जिस मामले में हम N
चर का उपयोग करते हैं, उसमें while
बार-बार मान को देखने के लिए एक अतिरिक्त मंदी है N
, लेकिन for
ऐसा नहीं करता है।
यह वास्तव में पागल है कि इस तरह के तुच्छ संशोधनों से 3x कोड स्पीडअप हो सकता है , लेकिन यह आपके लिए पायथन है। और मुझे तब भी शुरू न करें जब आप एक बिलिन से अधिक बिलियन का उपयोग कर सकते हैं ...।