다양한 답변이 정말 우아하다는 것을 알았지 만 (특히 Alex Martelli의) 성능을 직접 측정하고 싶었으므로 다음 스크립트를 작성했습니다.
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))
또한 Martelli의 솔루션을 기반으로 map()
하고 페이로드 함수를 호출하는 데 사용되는 대체 솔루션을 생각해 냈습니다 . OK, 나는 페이로드가 버려지는 매개 변수를 받아 들일 수있는 자유를 얻었습니다.이 주위에 방법이 있는지 모르겠습니다. 그럼에도 불구하고 결과는 다음과 같습니다.
standard: 0.8398549720004667
underscore: 0.8413165839992871
loopiter: 0.7110594899968419
loopiter2: 0.5891903560004721
따라서 map을 사용하면 표준 for 루프보다 약 30 %, Martelli보다 19 % 더 향상됩니다.