Python: списки Python сохраняют счетчик для len () или он учитывается для каждого вызова?


Если я продолжаю звонить len () в очень длинный список, я теряю время, или он держит int count в фоновом режиме?

7 59

7 ответов:

Не волнуйтесь: конечно, это экономит счет и таким образом len() на списках довольно дешевая операция. То же самое верно для строк, словарей и наборов, кстати!

и еще один способ узнать, как это делается чтобы посмотреть его на Google Code Searchпосмотрите на источник на GitHub, если вы не хотите загружать себя источник.

static Py_ssize_t list_length(PyListObject *a)
{
    return a->ob_size;
}

напишите свою программу так, чтобы она была оптимизировано для ясности и легко ремонтопригодно. Ваша программа яснее с вызовом len(foo)? Тогда сделай это.

вы беспокоитесь о времени? Используйте timeit модуль в стандартной библиотеке до мера время, затраченное, и посмотреть, является ли это существенным в вашем коде.

вы, как и большинство людей, очень вероятно, ошибаетесь в своих догадках о том, какие части вашей программы самый медленный. Избегайте соблазна угадать, а вместо этого измерьте его, чтобы узнать.

помните, что преждевременная оптимизация-корень всех зол по словам Дональда Кнута. Сосредоточиться только на скорость код измеряемые скорость, чтобы знать, стоит ли стоимость изменения, как это работает.

на этот вопрос был дан ответ (len за O(1)), но вот как вы можете проверить на себе:

$ python -m timeit -s "l = range(10)" "len(l)"
10000000 loops, best of 3: 0.119 usec per loop
$ python -m timeit -s "l = range(1000000)" "len(l)"
10000000 loops, best of 3: 0.131 usec per loop

Да, не особо медленнее.

"список" Python-это действительно массив с изменяемым размером, а не связанный список, поэтому он хранит размер где-то.

Он должен хранить длину где-то, так что вы не подсчитываете количество элементов каждый раз.