Якщо я продовжую дзвонити len () у дуже довгий список, я марно витрачаю час, чи це робить підрахунок int у фоновому режимі?
Якщо я продовжую дзвонити len () у дуже довгий список, я марно витрачаю час, чи це робить підрахунок int у фоновому режимі?
Відповіді:
Не хвилюйтеся: звичайно, це економить підрахунок, і, отже, 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
Так, не дуже повільніше.
Він повинен десь зберігати довжину, тому ви не будете рахувати кількість предметів кожного разу.