मुझे विभिन्न उत्तर वाकई बहुत खूबसूरत लगे (विशेषकर एलेक्स मार्टेली के) लेकिन मैं प्रदर्शन को पहले हाथ से निर्धारित करना चाहता था, इसलिए मैंने निम्नलिखित स्क्रिप्ट तैयार की:
from itertools import repeat
N = 10000000
def payload(a):
pass
def standard(N):
for x in range(N):
payload(None)
def underscore(N):
for _ in range(N):
payload(None)
def loopiter(N):
for _ in repeat(None, N):
payload(None)
def loopiter2(N):
for _ in map(payload, repeat(None, N)):
pass
if __name__ == '__main__':
import timeit
print("standard: ",timeit.timeit("standard({})".format(N),
setup="from __main__ import standard", number=1))
print("underscore: ",timeit.timeit("underscore({})".format(N),
setup="from __main__ import underscore", number=1))
print("loopiter: ",timeit.timeit("loopiter({})".format(N),
setup="from __main__ import loopiter", number=1))
print("loopiter2: ",timeit.timeit("loopiter2({})".format(N),
setup="from __main__ import loopiter2", number=1))
मैं एक वैकल्पिक समाधान के साथ भी आया जो मार्टेली के एक पर बनाता है और map()
पेलोड फ़ंक्शन को कॉल करने के लिए उपयोग करता है। ठीक है, मैंने इसमें थोड़ा धोखा दिया कि मैंने पेलोड को एक पैरामीटर स्वीकार करने की आजादी ले ली, जो छूट जाता है: मुझे नहीं पता कि इसके आसपास कोई रास्ता है या नहीं। फिर भी, यहाँ परिणाम हैं:
standard: 0.8398549720004667
underscore: 0.8413165839992871
loopiter: 0.7110594899968419
loopiter2: 0.5891903560004721
इसलिए मैप का उपयोग करने से लूप के लिए मानक पर लगभग 30% और मार्टेली पर एक अतिरिक्त 19% का सुधार होता है।