List comprehensions работать лучше здесь, потому что вам не нужно, чтобы загрузить атрибут на добавление списка и назовите его как функцию *
Рассмотрим следующий пример:
>>> import dis
>>> def f1():
... for i in range(5):
... l.append(i)
...
>>> def f2():
... [i for i in range(5)]
...
>>> dis.dis(f1)
2 0 SETUP_LOOP 33 (to 36)
3 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 1 (5)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 19 (to 35)
16 STORE_FAST 0 (i)
3 19 LOAD_GLOBAL 1 (l)
22 LOAD_ATTR 2 (append)
25 LOAD_FAST 0 (i)
28 CALL_FUNCTION 1
31 POP_TOP
32 JUMP_ABSOLUTE 13
>> 35 POP_BLOCK
>> 36 LOAD_CONST 0 (None)
39 RETURN_VALUE
>>> dis.dis(f2)
2 0 BUILD_LIST 0
3 LOAD_GLOBAL 0 (range)
6 LOAD_CONST 1 (5)
9 CALL_FUNCTION 1
12 GET_ITER
>> 13 FOR_ITER 12 (to 28)
16 STORE_FAST 0 (i)
19 LOAD_FAST 0 (i)
22 LIST_APPEND 2
25 JUMP_ABSOLUTE 13
>> 28 POP_TOP
29 LOAD_CONST 0 (None)
32 RETURN_VALUE
>>>
Вы можете видеть, что в байтовом коде 22 у нас есть атрибут append
в первой функции, так как у нас нет такой вещи во второй функции, используя понимание списка.
Также обратите внимание, что на каждой итерации вы будете иметь append
attr, поэтому ваш код займет примерно 2 раза медленнее второй функции, используя понимание списка.
Кроме того, в зависимости от вашего Python и кода, списочный может работать намного быстрее, чем вручную заявление for
цикла (часто примерно в два раза быстрее) , потому что их итерация выполняются на скорости языка C внутри интерпретатора, скорее , чем с ручным кодом Python. Специально для больших наборов данных, часто большое преимущество производительности для использования этого выражения. **
* Вы можете прочитать больше о Efficiency of list comprehensions
** Обучение Python by Mark Lutz
Проверьте это http://stackoverflow.com/questions/22108488/are-list-comprehensions-and-functional-functions-faster-than-for-loops –
Теперь все начали измерения скорости кода Python. .. – ForceBru
Чтобы быть справедливым, вы не должны использовать 'range' в этом конкурсе, если вы находитесь на Python 2. В Python 2' range' сам генерирует список, поэтому вы считаете создание этого списка в 'range' + добавление всех элементов в 't'. –