← Все вопросы

Что быстрее: вложенный генератор или явный цикл?

Задан 2 месяца назад6 просмотров1 ответ
0

Способ 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 ответ

0

да, генератор списка обычно быстрее явного цикла с .append(), но это не магия. причина конкретная: в генераторе нет повторного поиска и вызова метода append на каждой итерации, сборка идёт на уровне си. выигрыш обычно процентов 20-40 на простых телах. чем тяжелее тело — тем меньше разница, потому что время уходит на само тело, а не на механику цикла.

всегда ли быстрее — нет. как только внутри что-то громоздкое (условия, вложенность, побочки) или список-результат тебе вообще не нужен — цикл и понятнее, и не хуже. генератор ради .append() в пустоту или ради побочного эффекта (типа [print(x) for x in ...]) — это уже антипаттерн, так не пишут.

по практике: списко-генератор — когда реально собираешь список и тело короткое. логика в три этажа или просто что-то делаешь без накопления — обычный for. читаемость почти всегда важнее пары микросекунд, если это не горячий цикл на миллионы итераций

Ваш ответ

, чтобы ответить на вопрос.