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