Генератор или list comprehension для iterable?

l = [1, 2, 3]

Что лучше?

l.extend(i for i in range(1000000))

или

l.extend([i for i in range(1000000)])

Когда стоит использовать list comprehension, а когда генератор, если принимаются оба варианта?


Ответы (2 шт):

Автор решения: CrazyElf

В данном случае лучше всего:

l.extend(range(1000000))

В Python 3 range - это специальный объект и под оптимальную работу с ним специально заточены многие вещи, поэтому непосредственная работа с range часто оказывается быстрее всего.

Если же речь именно про само сравнение генератора со списковым включением, то нужно смотреть не слишком ли большой у вас список получается (в этом случае он может съесть память и замедлить работу интерпретатора) и на то, что вы дальше делаете с полученным результатом. В данном случае для использования в extend разница, думаю, будет не сильно существенной.

→ Ссылка
Автор решения: nomnoms12

Замеры показывают, что по скорости разница незначительна:

In [2]: %timeit l.extend(i for i in range(1000000))
80 ms ± 4.67 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [4]: %timeit l.extend([i for i in range(1000000)])
76.8 ms ± 5.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Но при этом списковое включение полностью сохраняет массив в память. В данном случае сохранять массив в память не нужно, поэтому лучше будет использовать генератор.

Хороший пример использования спискового включения — когда Вам необходимо после генерации списка применить к нему какой-либо из стандартных методов.

→ Ссылка