我需要根据某些约束找出最佳的媒体选择。我在FOUR嵌套for循环中做,因为它会需要O(n^4)迭代,它很慢。我一直在努力让它更快,但它仍然很慢。我的变量可能高达数千。Python:慢嵌套for循环
这里是什么,我试图做一个小例子:
max_disks = 5
max_ssds = 5
max_tapes = 1
max_BR = 1
allocations = []
for i in range(max_disks):
for j in range(max_ssds):
for k in range(max_tapes):
for l in range(max_BR):
allocations.append((i,j,k,l)) # this is just for example. In actual program, I do processing here, like checking for bandwidth and cost constraints, and choosing the allocation based on that.
它不是为多达数百每个媒体类型的慢,但会降低几千年。
我想其他的办法是:
max_disks = 5
max_ssds = 5
max_tapes = 1
max_BR = 1
allocations = [(i,j,k,l) for i in range(max_disks) for j in range(max_ssds) for k in range(max_tapes) for l in range(max_BR)]
通过这种方式,即使是这些小数字慢。
两个问题:
- 为什么第二个是小数字慢?
- 如何让我的程序适用于大数字(以千计)?
这里是版本itertools.product
max_disks = 500
max_ssds = 100
max_tapes = 100
max_BR = 100
# allocations = []
for i, j, k,l in itertools.product(range(max_disks),range(max_ssds),range(max_tapes),range(max_BR)):
pass
它需要19.8秒用这些数字来完成。
带有列表理解的第一个例子比第二个例子快*。它们在其他方面是等价的,但'allocations.append'属性查找和随后的方法调用减慢了嵌套循环。您可能想在这里查看'itertools.product()',并避免创建一个包含所有可能组合的巨大列表对象(而不是逐个处理这些项目)。 –
我也试过itertools.product()。但那也没有成千上万的工作。 – Pretty
你是否坚持建立一个分配清单?你已经知道你正在构建的列表的一般结构,所以你不能单独处理分配? –