LoginSignup
1
2

More than 3 years have passed since last update.

Python でスニペットの実行時間が気になったときに使える timeit

Posted at

突然ですが、あなたは 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 になったのでカンマ区切りに変えてます :cry:

>>> import timeit
>>> timeit.timeit('",".join(str(i * (i + 1)) for i in range(100))', number=10000)
0.21407770000000426

まとめ

Python で実装していて、大量データの処理とかで実行時間がシビアだよー、という状況では非常に役に立つライブラリだと思いました。
みなさんもお近くのコードで是非お試しください。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2