Мне нужно найти оптимальный выбор медиа, исходя из определенных ограничений. Я делаю это в ЧЕТЫРЕХ вложенных циклах for, и, поскольку это займет около O (n ^ 4) итераций, это медленно. Я пытался сделать это быстрее, но это все еще чертовски медленно. Мои переменные могут достигать нескольких тысяч.
Вот небольшой пример того, что я пытаюсь сделать:
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()
и не создавать огромный объект списка со всеми возможными комбинациями (вместо этого обрабатывайте элементы один за другим). - person Martijn Pieters   schedule 19.09.2016itertools.product()
еще быстрее, чем любой опубликованный вами метод, и непобедим, если вы сначала не материализуете все в список. Возможно, вы хотите показать, что еще вы делаете с комбинациями, которые вы создаете? Зачем вообще нужно создавать такое большое количество кортежей в списке? - person Martijn Pieters   schedule 19.09.2016