Я делал упражнение на 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
Почему это так?