避免嵌套 for 循环
- 2024-12-23 08:43:00
- admin 原创
- 51
问题描述:
我正在尝试反复测试其他一些 Python 代码,使用六个不同参数的所有可能值组合。对于每个参数,我想迭代给定最小值、最大值和步长的一系列值。
我设法编写了一些代码,例如:
for var1 in range(min1, max1, step1):
for var2 in range(min2, max2, step2):
for var3 in range(min3, max3, step3):
for var4 in range(min4, max4, step4):
for var5 in range(min5, max5, step5):
for var6 in range(min6, max6, step6):
do_something_with(var1, var2, var3, var4, var5, var6)
但我不喜欢代码嵌套这么深。
如何避免嵌套多重循环?可以使用递归吗?怎么样itertools.product
?我无法弄清楚这两种方法。
更一般地,另请参阅:获取一系列列表的笛卡尔积?
这个问题和一些答案最初显示的是 Python 2.x 的代码。它已被编辑,因为基本问题在 3.x 中仍然存在,解决方案相同,但xrange
不再存在 -range
是直接替换。有关更多信息,请参阅Python 2.X 中的 range 和 xrange 函数有什么区别?。
解决方案 1:
使用方法如下product
:
x1 = range(min1, max1, step1)
x2 = range(min2, max2, step2)
x3 = range(min3, max3, step3)
...
for v1, v2, v3, v4, v5, v6 in itertools.product(x1, x2, x3, x4, x5, x6):
do_something_with(v1, v2, v3, v4, v5, v6)
或者更紧凑一点:
ranges = [
range(min1, max1, step1),
range(min2, max2, step2),
range(min3, max3, step3),
...
]
for v1, v2, v3, v4, v5, v6 in itertools.product(*ranges):
do_something_with(v1, v2, v3, v4, v5, v6)
解决方案 2:
你也可以使用itertools.product
。比如
for var1, var2 in itertools.product(range(min1, max1, step1), range(min2, max2, step2)):
# stuff
但其中包含所有六个变量。
解决方案 3:
您可以使用multiprocessing
并itertools.product
加速和简化您的代码
import itertools
from multiprocessing import Pool
ranges = [
range(min1,max1,step1),
range(min2,max2,step2),
range(min3,max3,step3),
...
]
with Pool(os.cpu_count()-2) as p:
result = p.map(your_op_func, itertools.product(*ranges))
multiprocessing
可以加快你的任务(因为它是互斥任务)itertools.product
可以帮助你通过更有效的方式获得组合
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD