Меня это всегда беспокоило. особенно когда мой профилировщик сказал мне, что я потратил 2,2 секунды программы, которая выполнялась в течение одной минуты, вызывая эту функцию.
Натан
Ответы:
87
Не волнуйтесь: конечно, это экономит счет и, таким образом, работа len()со списками довольно дешевая. Кстати, то же самое и со строками, словарями и наборами!
Напишите свою программу так, чтобы она была оптимизирована для ясности и легко поддерживалась . Ваша программа понятнее с вызовом len(foo)? Тогда сделай это.
Вы беспокоитесь о затраченном времени? Используйте timeitмодуль в стандартной библиотеке, чтобы измерить затраченное время и посмотреть, имеет ли оно значение для вашего кода.
Вы, как и большинство людей, скорее всего, ошибетесь в своих предположениях о том, какие части вашей программы являются самыми медленными. Избегайте соблазна угадывать, вместо этого измерьте его, чтобы узнать.
Помните, что , по словам Дональда Кнута , преждевременная оптимизация - это корень всех зол . Сосредоточьтесь только на скорости кода, скорость которого вы измерили , чтобы знать, окупится ли выгода затрат на изменение того, как он работает.
Я программист всего несколько месяцев в моей работе, и я поддерживаю оба метода. Таймер предлагает двухстрочную защиту от большого объема общепринятых мнений («ВЫБРАТЬ ... СЛУЧАЙНО слишком дорого»), которые будут брошены вам на пути.
Jesvin Jose 05
5
На вопрос был дан ответ ( 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
Будьте осторожны, это не обязательно верно для всех языков. Некоторые языки на самом деле используют связанный список и могут хранить или не хранить метаданные о размере. Прекрасным примером является Lisp, где списки используют относительно примитивные структуры из двух ячеек для построения самих себя, без метаданных. В этих случаях длительный вызов занимает O (n) времени.
Ответы:
Не волнуйтесь: конечно, это экономит счет и, таким образом, работа
len()
со списками довольно дешевая. Кстати, то же самое и со строками, словарями и наборами!источник
И еще один способ узнать, как это делается, -
найти в Google Code Searchпосмотрите исходный код на GitHub , если вы не хотите загружать исходный код самостоятельно.static Py_ssize_t list_length(PyListObject *a) { return a->ob_size; }
источник
len
является операцией O (1) .источник
Напишите свою программу так, чтобы она была оптимизирована для ясности и легко поддерживалась . Ваша программа понятнее с вызовом
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
Да, не медленнее.
источник
«Список» Python - это действительно массив с изменяемым размером, а не связанный список, поэтому он где-то хранит размер.
источник
Он должен где-то хранить длину, поэтому вы не будете каждый раз считать количество элементов.
источник