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