繁体   English   中英

Python嵌套for循环比单循环更快

[英]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中最好使用generatorxrange() ,生成器生成数字而不是构建和分配列表。

另外,您可以在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM