Python: Списки Python ведут подсчет для len () или он учитывается для каждого вызова? - PullRequest
67 голосов
/ 31 марта 2009

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

Ответы [ 7 ]

67 голосов
/ 31 марта 2009

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

26 голосов
/ 31 марта 2009

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

static Py_ssize_t list_length(PyListObject *a)
{
    return a->ob_size;
}
23 голосов
/ 31 марта 2009
9 голосов
/ 31 марта 2009

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

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

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

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

5 голосов
/ 31 марта 2009

На вопрос дан ответ (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

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

3 голосов
/ 31 марта 2009

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

0 голосов
/ 31 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...