gpt4 book ai didi

python - 循环次数影响效率(解释语言还是编译语言?)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:40 25 4
gpt4 key购买 nike

假设您必须使用 2 个甚至 3 个循环来执行计算。直觉上,人们可能会认为使用单个循环执行此操作效率更高。我尝试了一个简单的 Python 示例:

import itertools
import timeit

def case1(n):
c = 0
for i in range(n):
c += 1
return c

def case2(n):
c = 0
for i in range(n):
for j in range(n):
for k in range(n):
c += 1
return c

print(case1(1000))
print(case2(10))

if __name__ == '__main__':
import timeit

print(timeit.timeit("case1(1000)", setup="from __main__ import case1", number=10000))

print(timeit.timeit("case2(10)", setup="from __main__ import case2", number=10000))

这段代码运行:

$ python3 code.py 
1000
1000
0.8281264099932741
1.04944919400441

如此有效,1 个循环似乎更有效率。然而,我的问题场景略有不同,因为我需要使用数组中的值(在下面的示例中,我使用函数 range 来简化)。也就是说,如果我将所有内容折叠成一个循环,我将不得不根据另一个数组的值创建一个扩展数组,该数组的大小介于 2 到 10 个元素之间。

import itertools
import timeit

def case1(n):

b = [i * j * k for i, j, k in itertools.product(range(n), repeat=3)]
c = 0
for i in range(len(b)):
c += b[i]
return c

def case2(n):

c = 0
for i in range(n):
for j in range(n):
for k in range(n):
c += i*j*k
return c

print(case1(10))
print(case2(10))

if __name__ == '__main__':
import timeit

print(timeit.timeit("case1(10)", setup="from __main__ import case1", number=10000))

print(timeit.timeit("case2(10)", setup="from __main__ import case2", number=10000))

在我的电脑中,这段代码运行于:

$ python3 code.py 
91125
91125
2.435348572995281
1.6435037050105166

所以看起来 3 个嵌套循环更有效,因为我花了一些时间在 case1 中创建数组 b。所以我不确定我是否以最有效的方式创建了这个数组,但撇开这个不谈,它真的能将折叠循环还清为单个循环吗?我在这里使用的是 Python,但是像 C++ 这样的编译语言呢?在这种情况下,编译器是否会做一些事情来优化单个循环?或者另一方面,当您有多个嵌套循环时,编译器是否会进行一些优化?

最佳答案

这就是为什么单循环函数花费的时间比预期的要长

b = [i * j * k for i, j, k in itertools.product(range(n), repeat=3)]

只需将整个函数更改为

def case1(n, b):
c = 0
for i in range(len(b)):
c += b[i]
return c

让时间返回:

case1 : 0.965343249744
case2 : 2.28501694207

关于python - 循环次数影响效率(解释语言还是编译语言?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29984854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com