Ответ 1
Перечисления списков более компактны и быстрее, чем явные for
цикла построения списка:
def slower():
result = []
for elem in some_iterable:
result.append(elem)
return result
def faster():
return [elem for elem in some_iterable]
Это связано с тем, что вызов .append()
в list
заставляет объект списка расти (в кусках), чтобы сделать пространство для новых элементов индивидуально, в то время как понимание списка собирает все элементы перед созданием list
чтобы он соответствовал элементам за один раз:
>>> some_iterable = range(1000)
>>> import timeit
>>> timeit.timeit('f()', 'from __main__ import slower as f', number=10000)
1.4456570148468018
>>> timeit.timeit('f()', 'from __main__ import faster as f', number=10000)
0.49323201179504395
Однако это не значит, что вы должны начинать пользоваться списками для всего! Понимание списка по-прежнему будет создавать объект списка; если вы используете понимание списка только потому, что оно дает вам однострочный цикл, подумайте еще раз. Вероятно, вы тратите впустую циклы, создавая объект списка, который вы затем отбрасываете. Просто придерживаться нормальной for
цикла в этом случае.