[英]Python nested for loop faster than single for loop
为什么嵌套for循环比单循环更快?
start = time()
k = 0
m = 0
for i in range(1000):
for j in range(1000):
for l in range(100):
m+=1
#for i in range(100000000):
# k +=1
print int(time() - start)
对于单个for循环,我获得14秒的时间,并且嵌套for循环为10秒
这是因为你使用的是Python2
。 范围生成数字列表,并且必须分配该列表。 在第一个嵌套循环中,您分配1000 + 1000 + 100
,因此列表大小为2100
,而在另一个嵌套循环中,列表的大小为100000000
,这要大得多。
在python2
中最好使用generator
, xrange()
,生成器生成数字而不是构建和分配列表。
另外,您可以在python3
阅读与此相关的问题
在Python 2中, range
创建一个包含列表中所有数字的列表。 尝试使用xrange
交换range
,您应该看到它们需要相当的时间,或者单循环方法可能会更快一些。
在嵌套循环期间,python必须为计数器分配1000+1000+100=2100
值,而在单循环中它必须分配10M
。 这就是花费额外时间的事情
我已经在python 3.6中测试了这个并且行为类似,我想这很可能是内存分配问题。
本主题将介绍相关上下文。
简而言之, range(100000000)
在Python 2中构建了一个巨大的列表,而对于嵌套循环,您只构建总共1000 + 1000 + 100 = 2100个元素的列表。 在Python 3中, range
Python 2中的xrange
更智能和懒惰。
以下是代码的一些时间安排。 绝对运行时取决于系统,但将值相互比较是有价值的。
import timeit
runs = 100
code = '''k = 0
for i in range(1000):
for j in range(1000):
for l in range(100):
k += 1'''
print(timeit.timeit(stmt=code, number=runs))
code = '''k = 0
for i in range(100000000):
k += 1'''
print(timeit.timeit(stmt=code, number=runs))
输出:
CPython 2.7 - range
264.650791883
372.886064053
解读:构建庞大的列表需要时间。
CPython 2.7 - 与xrange
交换range
231.975350142
221.832423925
解释:几乎与预期一样平等。 (嵌套for
循环应该比单个for
循环稍微大一些。)
CPython 3.6 - range
365.20924194483086
437.26447860104963
解读:有意思! 我没想到这一点。 任何人?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.