突然ですが、あなたは 0 以上の隣り合った整数の積を改行区切りでコンソールに表示したいとします。
どのように書いたらいいでしょうか?
いろいろな書き方があると思います・・・(print は省略)
"\n".join(str(i * (i + 1)) for i in range(100))
や
"\n".join([str(i * (i + 1)) for i in range(100)])
だったり
"\n".join(map(lambda x: str(x * (x + 1)), range(100)))
その他、こんなパターンもあると思います。
"\n".join([f"{i * (i + 1)}" for i in range(100)])
これは改行が 1 個多いですが print するときに end=""
を指定すれば同じ結果が得られるのでヨシ!
for i in range(100): str(i * (i + 1)) + "\n"
timeit ライブラリ
Python ではこういった断片的なコードの実行時間を、timeit というライブラリを用いてお手軽に調べることができます。
https://docs.python.org/ja/3/library/timeit.html
コマンドラインから利用する
次のようなコマンドで調べることができます。
python -m timeit '"\n".join(str(i * (i + 1)) for i in range(100))'
1 万ループ回して一番速かったのが 20.9 マイクロ秒だったそう。
$ python -m timeit '"\n".join(str(i * (i + 1)) for i in range(100))'
10000 loops, best of 5: 20.9 usec per loop
他のコードでもやってみました。
$ python -m timeit '"\n".join([str(i * (i + 1)) for i in range(100)])'
20000 loops, best of 5: 18.4 usec per loop
$ python -m timeit '"\n".join(map(lambda x: str(x * (x + 1)), range(100)))'
10000 loops, best of 5: 22.7 usec per loop
$ python -m timeit '"\n".join([f"{i * (i + 1)}" for i in range(100)])'
20000 loops, best of 5: 12.3 usec per loop
$ python -m timeit 'for i in range(100): str(i * (i + 1)) + "\n"'
10000 loops, best of 5: 20.7 usec per loop
格段に速いのがありますね。
Python インタプリタで利用する
改行区切りにしたら SyntaxError: EOL while scanning string literal
になったのでカンマ区切りに変えてます
>>> import timeit
>>> timeit.timeit('",".join(str(i * (i + 1)) for i in range(100))', number=10000)
0.21407770000000426
まとめ
Python で実装していて、大量データの処理とかで実行時間がシビアだよー、という状況では非常に役に立つライブラリだと思いました。
みなさんもお近くのコードで是非お試しください。