Tôi đã tìm thấy những câu trả lời khác nhau thực sự tao nhã (đặc biệt là của Alex Martelli) nhưng tôi muốn định lượng hiệu suất đầu tiên, vì vậy tôi đã nấu kịch bản sau:
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))
Tôi cũng đã đưa ra một giải pháp thay thế dựa trên giải pháp của Martelli và sử dụng map()
để gọi hàm tải trọng. OK, tôi đã lừa dối một chút rằng tôi có quyền tự do làm cho trọng tải chấp nhận một tham số bị loại bỏ: Tôi không biết liệu có cách nào khác không. Tuy nhiên, đây là kết quả:
standard: 0.8398549720004667
underscore: 0.8413165839992871
loopiter: 0.7110594899968419
loopiter2: 0.5891903560004721
do đó, sử dụng bản đồ mang lại sự cải thiện khoảng 30% so với tiêu chuẩn cho vòng lặp và thêm 19% so với Martelli.