【问题标题】:Python nested for loop faster than single for loopPython嵌套for循环比单个for循环快
【发布时间】:2019-04-15 08:47:40
【问题描述】:
为什么嵌套 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 秒的时间和 10 秒的嵌套 for 循环
【问题讨论】:
标签:
python
for-loop
runtime
nested-loops
【解决方案1】:
this主题中解释了相关上下文。
简而言之,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 - range 与 xrange 交换
231.975350142
221.832423925
解释:几乎相等,正如预期的那样。 (嵌套的for 循环应该稍微
比单个 for 循环更大的开销。)
CPython 3.6 - range
365.20924194483086
437.26447860104963
解读:有趣!我没想到会这样。有人吗?
【解决方案2】:
在嵌套循环期间,python 必须为计数器分配 1000+1000+100=2100 值,而在单循环中,它必须分配 10M。这就是需要额外时间的原因
我在 python 3.6 中对此进行了测试,并且行为相似,我会说这很可能是内存分配问题。
【解决方案3】:
在 Python 2 中,range 创建一个列表,其中包含列表中的所有数字。尝试将range 与xrange 交换,您应该会看到它们所花费的时间相当,或者单循环方法可能会更快一些。
【解决方案4】:
这是因为您使用的是Python2。 Range 生成一个数字列表,并且必须分配该列表。在第一个嵌套循环中,您分配了1000 + 1000 + 100,因此列表大小为2100,而在另一个嵌套循环中,列表的大小为100000000,要大得多。
在python2 中最好使用generator、xrange(),生成器会生成数字,而不是用它们构建和分配列表。
此外,有关更多信息,您可以阅读this question,它与此相关,但在python3中