我们都知道在Python中执行一段语句的常用方法是使用for
循环。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彼得斯的建议,
.
.
.
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)'。 –
第二种方法的一个主要问题是它为整个丢弃列表分配存储空间。 –
但是在实际的代码中,循环的主体将更加复杂,并且在所有时间中占主导地位。如果迭代变量不重要,则只需旋转车轮即可。 – hpaulj