Посмотрите на два простых примера кода. Какой из них работает быстрее и почему?
Вариант 1
my_list = []Вариант 2
...
# наполняем список данными
...
while my_list:
print(my_list.pop())
my_list = []Для опытного разработчика очевидно, что оптимален первый вариант.
...
# наполняем список данными
...
while len(my_list) > 0:
print(my_list.pop())
Почему?
Список, как и другие коллекция Python - объект. Внутри объекта хранятся не только данные (на самом деле не данные, а указатели на данные), но и полезная информация. Одна из таких полезностей - количество элементов коллекции. Это целое число, которое автоматически меняется при добавлении и удалении элементов. Объект коллекции всегда помнит сколько в нём элементов.
Вариант 1 обращается к количеству напрямую, получает целое число и если оно ноль, у нас False. А если не ноль - True.
Вариант 2 вызывает функцию len(), которая обращается к счётчику количества элементов в коллекции и получает целое число. Если число больше нуля, у нас True. А если нет - False.
Очевидно, что получение int и его преобразование к bool работает быстрее, чем вызов функции, которая возвращает int для сравнения с другим int и получения bool 🧐
P.S. Для любителей асимптотики. Оба варианта работают за O(1) 😉