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

时间:2018-11-12 15:36:35

标签: python for-loop runtime nested-loops

为什么嵌套的for循环比单个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秒的时间

4 个答案:

答案 0 :(得分:1)

这是因为您正在使用Python2。 Range生成一个数字列表,并且必须分配该列表。在第一个嵌套循环中,您正在分配1000 + 1000 + 100,因此列表大小为2100,而在另一个嵌套循环中,列表的大小为100000000,这要大得多。

python2中最好使用generatorxrange(),生成器将生成数字,而不是使用数字生成并分配列表。

有关其他信息,您可以在python3this question与此相关,

答案 1 :(得分:1)

在Python 2中,range创建一个列表,其中包含列表中的所有数字。尝试将rangexrange交换,您应该看到它们花费了相当的时间,否则单循环方法可能会更快一些。

答案 2 :(得分:1)

在嵌套循环中,python必须为计数器分配1000+1000+100=2100的值,而在单循环中,它必须分配10M。这是多余的时间

我已经在python 3.6中进行了测试,其行为类似,我很可能认为这是内存分配问题。

答案 3 :(得分:1)

相关上下文在this主题中进行了说明。

简而言之,range(100000000)在Python 2中构建了一个 huge 列表,而使用嵌套循环,您只能构建总共包含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-range交换了xrange

231.975350142
221.832423925

解释:与预期的差不多。 (嵌套的for循环应略有循环 比单个for循环要大的开销。)

CPython 3.6-range

365.20924194483086
437.26447860104963

解释:有趣!我没想到这一点。有人吗?