Мне дано понять, что чем больше становится список, тем медленнее становятся операции со списком.
В общем, это не так.Списки в Python - это, несмотря на название, не связанные списки, а массивы.Есть операции, которые являются O (n) для массивов (например, копирование и поиск), но вы, кажется, не используете ни один из них.Практическое правило: если он широко используется и идиоматичен, некоторые умные люди пошли и выбрали умный способ сделать это.list.append
- широко используемая встроенная функция (а лежащая в основе функция C также используется в других местах, например, в списках).Если бы существовал более быстрый способ, он бы уже использовался.
Как вы увидите, когда вы будете проверять исходный код , списки перераспределяются, то есть, когда их размер изменяется, они выделяют большечем необходимо для одного элемента, так что следующие n элементов могут быть добавлены без необходимости другого изменения размера (то есть O (n)).Рост не является постоянным, он пропорционален размеру списка, поэтому изменение размера становится все реже по мере увеличения списка.Вот фрагмент из listobject.c:list_resize
, который определяет перераспределение:
/* This over-allocates proportional to the list size, making room
* for additional growth. The over-allocation is mild, but is
* enough to give linear-time amortized behavior over a long
* sequence of appends() in the presence of a poorly-performing
* system realloc().
* The growth pattern is: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
*/
new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);
Как отмечает Марк Рэнсом, более старые версии Python (<2.7, 3.0) имеют ошибку, которая заставляет GC саботировать это.Если у вас есть такая версия Python, вы можете отключить gc.Если вы не можете этого сделать, потому что генерируете слишком много мусора (что приводит к перерасчету), вам не повезло. </p>