Мне дано понять, что Чем больше список, тем медленнее выполняются операции с списком.
Это не так в общем. Списки в Python, несмотря на имя, не связаны списки, но массивы. Существуют операции, которые являются O (n) на массивах (например, копирование и поиск), но вы, похоже, не используете их. Как правило: если это широко используется и идиоматично, некоторые умные люди пошли и выбрали разумный способ сделать это. list.append
является широко используемым встроенным (и базовая функция C также используется в других местах, например, в списках). Если бы был более быстрый способ, он уже был бы использован.
Как вы увидите, когда вы проверяете the source code, списки суммируются, то есть когда они изменяются, они выделяют больше, чем необходимо для одного элемента, поэтому следующие n элементов могут быть добавлены без необходимости изменения размера (что является O (n)). Рост не является постоянным, он пропорционален размеру списка, поэтому изменение размера становится все реже, поскольку список увеличивается. Вот отрывок из listobject.c:list_resize
, который определяет overallocation:
/* 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. Если вы не можете, потому что вы генерируете слишком много мусора (что ускоряет пересчет), вам не повезло.
_ «Мне дано понять, что чем больше список становится, тем медленнее выполняются операции с списком». _ '[Править]' –
Вы пытались запустить его в течение 24 часов и видели проблему? В чем проблема? – tMC
@Matt, см. Http://stackoverflow.com/questions/2473783/is-there-a-way-to-circumvent-python-list-append-becoming-progressively-slower-i –