Если я продолжаю вызывать len() в очень длинном списке, я теряю время или не задерживаю int count в фоновом режиме?
Python: содержат ли списки Python счетчик для len() или он рассчитывает на каждый вызов?
Ответ 1
Не волнуйтесь: конечно, это экономит счет, и поэтому len()
в списках - довольно дешевая операция. То же самое верно для строк, словарей и наборов, кстати!
Ответ 2
И еще один способ узнать, как это сделать: найти его в Google Code Search посмотрите источник на GitHub, если вы не хотите загружать источник самостоятельно.
static Py_ssize_t list_length(PyListObject *a)
{
return a->ob_size;
}
Ответ 3
Ответ 4
Напишите свою программу, чтобы она оптимизировалась для ясности и легко поддерживалась. Является ли ваша программа более понятной с вызовом len(foo)
? Затем сделайте это.
Вы беспокоитесь о времени? Используйте timeit
модуль в стандартной библиотеке, чтобы измерить время и посмотреть, значимо ли это в вашем коде.
Вы, как и большинство людей, скорее всего ошибаетесь в своих догадках о том, какие части вашей программы являются самыми медленными. Избегайте соблазна угадать, и вместо этого измерьте его, чтобы узнать.
Помните, что преждевременная оптимизация - это корень всего зла, по словам Дональда Кнута. Только сосредоточьтесь на скорости кода, которую вы измерили скорость, чтобы узнать, стоит ли стоить того, как она работает.
Ответ 5
Ответ на этот вопрос (len
is 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
Да, не совсем медленнее.
Ответ 6
Список "Python" Python на самом деле представляет собой масштабируемый массив, а не связанный список, поэтому он сохраняет размер где-то.
Ответ 7
Он должен хранить длину где-то, поэтому вы не рассчитываете количество элементов каждый раз.