Python嵌套for循环比单个for循环快
为什么嵌套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秒的时间,这
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
?可能是的。有关上下文,请阅读。