Производительность карты против выражения генератора - PullRequest
0 голосов
/ 20 сентября 2018

Я делал упражнение на Python, чтобы найти все четные числа между двумя значениями.Я получил следующий результат

','.join(str(i) for i in range(1000, 3000+1) if i % 2 == 0)

Но потом я заметил, что это было немного медленнее, чем использование map

In [105]: %timeit ','.join(str(i) for i in range(1000, 3000+1) if i % 2 == 0)
1000 loops, best of 3: 412 µs per loop

In [107]: %timeit ','.join(map(str, (i for i in range(1000, 3000+1) if i % 2 == 0)))
1000 loops, best of 3: 374 µs per loop

Исследуя это, я столкнулся с этимответ , который объясняет, что при использовании выражения генератора в join

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

Это подсказало бы мне, что приведение map на list быстрее, чем наложить генератор

In [109]: %timeit list(map(str, (i for i in range(1000, 3000+1) if i % 2 == 0)))
1000 loops, best of 3: 366 µs per loop

In [110]: %timeit list(str(i) for i in range(1000, 3000+1) if i % 2 == 0)
1000 loops, best of 3: 399 µs per loop

Почему это так?

...