Я тестировал скорость нескольких различных способов выполнения сложных итераций над некоторыми из моих данных, и я обнаружил кое-что странное. Кажется, что наличие большого списка, локального для некоторой функции, значительно замедляет эту функцию, даже если она не касается этого списка. Например, создание двух независимых списков с помощью двух экземпляров одной и той же функции генератора во второй раз происходит примерно в 2,5 раза медленнее. Если первый список будет удален до создания второго, оба итератора будут работать с одной и той же скоростью.
def f():
l1, l2 = [], []
for c1, c2 in generatorFxn():
l1.append((c1, c2))
# destroying l1 here fixes the problem
for c3, c4 in generatorFxn():
l2.append((c3, c4))
В итоге списки будут иметь длину около 3,1 миллиона элементов каждый, но я видел тот же эффект и с меньшими списками. Первый цикл for
выполняется примерно за 4,5 секунды, второй - за 10,5 секунды. Если я вставлю l1 = []
или l1 = len (l1)
в позицию комментария, оба для
циклов займут 4,5 секунды.
Почему скорость выделения локальной памяти в функции имеет какое-либо отношение к текущему размеру этой функции? Отключение сборщика мусора все исправляет, поэтому должно быть из-за того, что он постоянно работает. Дело закрыто!