Что быстрее: вложенный генератор или явный цикл?
Способ 1
flat = [x for row in matrix for x in row]
Способ 2
flat = [] for row in matrix: for x in row: flat.append(x)
Я читал, что генераторы быстрее. Но насколько? И всегда ли они быстрее? Может, есть случаи, когда явный цикл читаемее и разница в скорости не важна?
1 ответ
да, генератор списка обычно быстрее явного цикла с .append(), но это не магия. причина конкретная: в генераторе нет повторного поиска и вызова метода append на каждой итерации, сборка идёт на уровне си. выигрыш обычно процентов 20-40 на простых телах. чем тяжелее тело — тем меньше разница, потому что время уходит на само тело, а не на механику цикла.
всегда ли быстрее — нет. как только внутри что-то громоздкое (условия, вложенность, побочки) или список-результат тебе вообще не нужен — цикл и понятнее, и не хуже. генератор ради .append() в пустоту или ради побочного эффекта (типа [print(x) for x in ...]) — это уже антипаттерн, так не пишут.
по практике: списко-генератор — когда реально собираешь список и тело короткое. логика в три этажа или просто что-то делаешь без накопления — обычный for. читаемость почти всегда важнее пары микросекунд, если это не горячий цикл на миллионы итераций