Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python嵌套for循环比单个for循环快_Python_For Loop_Runtime_Nested Loops - Fatal编程技术网

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

Python嵌套for循环比单个for循环快,python,for-loop,runtime,nested-loops,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秒的时间,这

为什么嵌套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秒的时间,这是因为您使用的是
Python2
。Range生成一个数字列表,并且必须分配该列表。在第一个嵌套循环中,您分配的是
1000+1000+100
,因此列表大小为
2100
,而在另一个嵌套循环中,列表大小为
100000000
,更大

python2
中,最好使用
generator
xrange()
,generator生成数字,而不是构建和分配数字列表


另外,对于进一步的信息,您可以阅读到它与此相关,但在Python 2中的python3中,
range
创建了一个包含列表中所有数字的列表。尝试用
xrange
交换
range
,您会发现它们需要相当的时间,否则单循环方法可能会更快一些。

在嵌套循环期间,python必须为计数器分配
1000+1000+100=2100
值,而在单循环中,它必须分配
10M
。这就是额外花费时间的原因


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

相关上下文将在主题中解释

简而言之,
range(100000000)
在Python2中构建了一个巨大的列表,而在嵌套循环中,您只构建了总共包含1000+1000+100=2100个元素的列表。在Python3中,
range
比Python2中的
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-
范围

264.650791883
372.886064053
231.975350142
221.832423925
365.20924194483086
437.26447860104963
解释:建立庞大的列表需要时间

CPython 2.7-
range
xrange
交换

264.650791883
372.886064053
231.975350142
221.832423925
365.20924194483086
437.26447860104963
释义:与预期几乎相同。(嵌套的
for
循环应具有 对于循环,开销大于单个

CPython 3.6-
范围

264.650791883
372.886064053
231.975350142
221.832423925
365.20924194483086
437.26447860104963

解说:有趣!我没想到会这样。有人吗?

你在用
Python2
?可能是的。有关上下文,请阅读。