我需要根據某些約束找出最佳的媒體選擇。我在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
你是否堅持建立一個分配清單?你已經知道你正在構建的列表的一般結構,所以你不能單獨處理分配? –