我们都知道,在Python中执行语句一定次数的常见方法是使用for
循环。
一般的做法是
# I am assuming iterated list is redundant.
# Just the number of execution matters.
for _ in range(count):
pass
我相信没有人会争辩说上面的代码是通用的实现,但是还有另一种选择。通过增加引用来使用Python列表创建的速度。
# Uncommon way.
for _ in [0] * count:
pass
还有旧的while
方法。
i = 0
while i < count:
i += 1
我测试了这些方法的执行时间。这是代码。
import timeit
repeat = 10
total = 10
setup = """
count = 100000
"""
test1 = """
for _ in range(count):
pass
"""
test2 = """
for _ in [0] * count:
pass
"""
test3 = """
i = 0
while i < count:
i += 1
"""
print(min(timeit.Timer(test1, setup=setup).repeat(repeat, total)))
print(min(timeit.Timer(test2, setup=setup).repeat(repeat, total)))
print(min(timeit.Timer(test3, setup=setup).repeat(repeat, total)))
# Results
0.02238852552017738
0.011760978361696095
0.06971727824807639
如果差异很小,我就不会开始,但是可以看出,速度差异是100%。如果第二种方法效率更高,为什么Python不鼓励这种用法?有没有更好的办法?
该测试是使用Windows 10和Python 3.6完成的。
遵循@Tim Peters的建议,
.
.
.
test4 = """
for _ in itertools.repeat(None, count):
pass
"""
print(min(timeit.Timer(test1, setup=setup).repeat(repeat, total)))
print(min(timeit.Timer(test2, setup=setup).repeat(repeat, total)))
print(min(timeit.Timer(test3, setup=setup).repeat(repeat, total)))
print(min(timeit.Timer(test4, setup=setup).repeat(repeat, total)))
# Gives
0.02306803115612352
0.013021619340942758
0.06400113461638746
0.008105080015739174
这提供了一种更好的方法,这几乎回答了我的问题。
为什么这比快range
,因为两者都是发电机。是因为价值永远不变吗?
for _ in itertools.repeat(None, count)
。