Saya menemukan berbagai jawaban yang sangat elegan (terutama jawaban Alex Martelli) tetapi saya ingin mengukur sendiri kinerjanya, jadi saya membuat skrip berikut:
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))
Saya juga datang dengan solusi alternatif yang dibangun di atas Martelli dan digunakan map()
untuk memanggil fungsi payload. OK, saya sedikit curang karena saya mengambil kebebasan untuk membuat payload menerima parameter yang dibuang: Saya tidak tahu apakah ada cara untuk mengatasi ini. Namun demikian, berikut hasilnya:
standard: 0.8398549720004667
underscore: 0.8413165839992871
loopiter: 0.7110594899968419
loopiter2: 0.5891903560004721
jadi menggunakan peta menghasilkan peningkatan sekitar 30% di atas standar untuk loop dan tambahan 19% di atas Martelli.