問題
次のPythonの記述はすべて同じ結果になります。
計算時間もほぼ一緒ですが、1つだけ少し時間がかかります。
その書き方はどれでしょうか?
"".join(map(str, range(1_000_000)))"".join(str(i) for i in range(1_000_000))"".join([str(i) for i in range(1_000_000)])
解答
答えは2です。
実際に確認してみましょう。下記はPython 3.13で実行した結果です。
たしかに2番のジェネレーターだけ少し遅いです。
下記のブログによると、str.join()は、ジェネレーターを渡すとリストに変換してから計算するようです。
その変換の分だけ時間がよけいにかかると思われます。
str.join()の公式ドキュメントには、特に記述はないようです。
なお、先のブログによると、この現象はCPython特有とのことです。
まとめ
str.join()の書き方の違いによる計算時間を確認しました。
ジェネレーターとリストの内包表記が同じ結果になるとき、一般に、ジェネレーターの方が効率的です。
しかし、str.join()に限っては内包表記の方が若干効率的になります。
