При условии, что более длинный список имеет больший объем памяти, your_list
имеет объем памяти, который можно получить с помощью следующего кода:
import sys
sys.getsizeof(your_list)
(Примечание: это зависит от реализации Python. Пожалуйста, прочитайте Сколько байтов на элемент содержится в списке Python (кортеж)? )
Есть несколько способов продолжить. Если ваш исходный «конвейер» списков может быть отсортирован по key=sys.getSizeof
, то вы можете нарезать и назначить для обработки N каждый N-й элемент ( Pythonic способ возврата списка каждого n-го элемента в большем списке ).
Пример:
sorted_pipeline = [list1,list2,list3,.......]
sorted_pipeline[0::10] # every 10th item, assign to the first sub-process of 10
Это сбалансирует нагрузки справедливым образом, сохраняя сложность O (NlogN) из-за исходной сортировки и затем постоянную (или линейную, если списки копируются) для назначения списков.
Иллюстрация (по запросу) разделения 10 элементов на 3 группы:
>>> my_list = [0,1,2,3,4,5,6,7,8,9]
>>> my_list[0::3]
[0, 3, 6, 9]
>>> my_list[1::3]
[1, 4, 7]
>>> my_list[2::3]
[2, 5, 8]
И окончательное решение:
assigned_groups = {}
for i in xrange(size):
assigned_groups[i] = sorted_pipeline[i::size]
Если это невозможно, вы всегда можете сохранить счетчик общего размера очереди, для каждого конвейера подпроцесса, а также вероятность изменения или логику выбора, чтобы учесть это.