Python 嵌套 for 循环比单个 for 循环更快
Python nested for loop faster than single for loop
为什么嵌套 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 循环
因为您正在使用Python2
。 Range 生成一个数字列表,并且必须分配该列表。在第一个嵌套循环中,您正在分配 1000 + 1000 + 100
,因此列表大小为 2100
,而在另一个嵌套循环中,列表的大小为 100000000
,要大得多。
在 python2
中最好使用 generator
、xrange()
,生成器生成数字而不是用它们构建和分配列表。
此外,有关更多信息,您可以阅读 它与此相关,但在 python3
在 Python 2 中,range
创建一个包含列表中所有数字的列表。尝试将 range
与 xrange
交换,您应该会看到它们花费的时间相当,或者单循环方法可能会更快一些。
在嵌套循环中 python 必须为计数器分配 1000+1000+100=2100
个值,而在单个循环中它必须分配 10M
个值。这就是花费额外时间的原因
我已经在 python 3.6 中对此进行了测试并且行为相似,我会说这很可能是内存分配问题。
相关上下文在 主题中进行了解释。
简而言之,range(100000000)
在 Python 2 中构建了一个 巨大的 列表,而对于嵌套循环,您只能构建总共 1000 + 1000 + 100 = 2100 个元素。在 Python 3 中,range
比 Python 中的 xrange
更聪明和懒惰 2.
下面是以下代码的一些时序。绝对运行时间取决于系统,但相互比较这些值很有价值。
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
解读:有趣!我没想到这一点。有人吗?
为什么嵌套 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 循环
因为您正在使用Python2
。 Range 生成一个数字列表,并且必须分配该列表。在第一个嵌套循环中,您正在分配 1000 + 1000 + 100
,因此列表大小为 2100
,而在另一个嵌套循环中,列表的大小为 100000000
,要大得多。
在 python2
中最好使用 generator
、xrange()
,生成器生成数字而不是用它们构建和分配列表。
此外,有关更多信息,您可以阅读 python3
在 Python 2 中,range
创建一个包含列表中所有数字的列表。尝试将 range
与 xrange
交换,您应该会看到它们花费的时间相当,或者单循环方法可能会更快一些。
在嵌套循环中 python 必须为计数器分配 1000+1000+100=2100
个值,而在单个循环中它必须分配 10M
个值。这就是花费额外时间的原因
我已经在 python 3.6 中对此进行了测试并且行为相似,我会说这很可能是内存分配问题。
相关上下文在
简而言之,range(100000000)
在 Python 2 中构建了一个 巨大的 列表,而对于嵌套循环,您只能构建总共 1000 + 1000 + 100 = 2100 个元素。在 Python 3 中,range
比 Python 中的 xrange
更聪明和懒惰 2.
下面是以下代码的一些时序。绝对运行时间取决于系统,但相互比较这些值很有价值。
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
解读:有趣!我没想到这一点。有人吗?