Python: списки Python сохраняют счетчик для len () или он учитывается для каждого вызова?
Если я продолжаю звонить len () в очень длинный список, я теряю время, или он держит int count в фоновом режиме?
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
Да, не особо медленнее.