在代码中使用map
将其替换为imap
(主要用于样式) - 所以我对我的主要用例进行了性能测试:
import random
import string
import timeit
repeat = 3
numbers = 1000
def time(statement, _setup=None):
print min(
timeit.Timer(statement, setup=_setup or setup).repeat(repeat, numbers))
random.seed('slartibartfast')
length = 10
li = [''.join(random.choice(string.ascii_uppercase) for __ in range(16)) for _
in range(length)]
print len(li)
setup = """from itertools import imap
from __main__ import li
"""
print 'join:'
time("','.join(map(str.lower, li))")
time("','.join(imap(str.lower, li))")
print 'tuple:'
time("tuple(map(str.lower, li))")
time("tuple(imap(str.lower, li))")
print 'for:'
time('for _ in (map(str.lower, li)): pass')
time('for _ in (imap(str.lower, li)): pass')
大名单的结果还可以:
10000
join:
4.34010698679
3.95416465252
tuple:
3.57020920625
3.93349155589
for:
3.17242116829
2.66427889191
但是元组调用的结果让我感到惊讶 - 所以我用较小的列表进行测试,这让我更加惊讶:
10
join:
0.00541496942211
0.0062448383055
tuple:
0.00517576996075
0.00560386370428
for:
0.00521174982402
0.00442818835725
for
仍然更快(这确实是一个惊喜)但使用imap
时加入和元组调用会更慢。我能想到的唯一可能的原因是它们耗尽了迭代器 - 我是对的吗?但是如何加快大型名单的加入呼叫呢?
免责声明:这不是 性能问题,而是关于如何实施的问题。