Мне нужно найти оптимальный выбор носителя, основанный на определенных ограничениях. Я делаю это в четырехмерном вложенном цикле, и поскольку это потребует итераций O (n^4), оно медленное. Я пытался сделать это быстрее, но все равно чертовски медленно. Мои переменные могут достигать пары тысяч.Python: медленный вложенный цикл
Вот небольшой пример того, что я пытаюсь сделать:
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
Вы настаиваете на создании списка распределений? Вы уже знаете общую структуру списка, который вы строите, так что вы не можете обрабатывать распределения отдельно? –