Производительность обоих ваших фрагментов довольно схожа, очевидно, не каждый шаг одинаков. Для небольших значений number
первый код (список) немного быстрее, но для больших number
второй код (генератор) выигрывает.
Другое дело - использование памяти - для создания списка требуется объем памяти, пропорциональный его размер, поэтому больший number
потребляет больше оперативной памяти. Более того, по мере роста списка требуется перераспределение памяти, что в конечном итоге вызывает сборщик мусора (timeit()
по умолчанию отключает gc
, искажение результатов). С другой стороны, версия генератора использует одинаковый (минимальный) объем памяти для любого number
.
Вывод состоит в том, что вы должны использовать выражения генератора всякий раз, когда это возможно. Это особенно важно, когда вы заботитесь об объеме памяти и / или работаете с большими числами. Кроме того, в этом случае ваш код будет немного короче и чище (спорный).
Этот вопрос объясняется в PEP 289 , представляющем выражения генератора.