python -m timeitの使い方|コマンドラインで処理時間を1行で測る(-n・-r・-s・-u)

python -m timeit “コード” と打つと、ファイルを作らずにターミナルから1行で処理時間を測れます。結果の「500000 loops, best of 5: 279 nsec per loop」は、50万回の実行を5セット行い、最も速かったセットの1回あたりの時間が279ナノ秒だった、という意味です。準備の処理は -s に書けば計測から外れます。

この記事は、timeit の使い方のうちコマンドラインで使う方法だけに絞った解説です。Pythonのコードから timeit.timeit() を呼ぶ方法や、プログラム全体の時間を測る time.perf_counter() との使い分けはPythonのtimeitで処理時間を測る方法にまとめています。

実行例は、macOS(Apple Silicon)上の Python 3.14.8 で動かした結果です。数値はパソコンや実行のたびに変わるので、自分の環境での比較に使ってください。オプションの説明は公式ドキュメント(timeit — Measure execution time of small code snippets、2026年10月18日確認)にもとづいています。

基本:python -m timeit “測りたいコード”

$ python3 -m timeit "sum(range(100))"
500000 loops, best of 5: 279 nsec per loop
表示 意味
500000 loops 1セットでコードを50万回実行した
best of 5 それを5セット行い、最も速いセットを採用した
279 nsec per loop 1回あたり279ナノ秒

表示はすでに1回あたりに割り算されています。Pythonから呼ぶ timeit.timeit() は合計の秒数を返すので、ここが違います。

Windowsで python3 が見つからない場合は python -m timeit や py -m timeit に読み替えてください。

回数は自動で決まる

-n を付けないと、1, 2, 5, 10, 20, 50…と回数を増やしながら試し、合計が0.2秒以上になる回数を選びます。-v を付けると、その様子が見えます。

$ python3 -m timeit -v "sum(range(100))"
1 loop -> 1.37e-06 sec
2 loops -> 1.08e-06 sec
5 loops -> 1.54e-06 sec
(中略)
500000 loops -> 0.145 sec
1000000 loops -> 0.288 sec

raw times: 288 msec, 290 msec, 286 msec, 288 msec, 282 msec

1000000 loops, best of 5: 282 nsec per loop

100万回で0.2秒を超えたので、100万回×5セットで測っています。raw times は各セットの合計時間です。

2026年10月9日に公開された Python 3.15 では、この「0.2秒」を変えられる -t(--target-time)オプションが追加されました(公式ドキュメントの Added in version 3.15 の記載、PEP 790 で3.15.0の公開日を確認、いずれも2026年10月18日確認)。3.14以前では使えず、3.14.8で付けると option -t not recognized と表示されます。

オプション一覧

オプション 意味
-n N(–number) 1セットの実行回数を指定する
-r N(–repeat) セット数を指定する(既定は5)
-s S(–setup) 最初に1回だけ実行する準備のコード(計測に含まれない)
-u U(–unit) 表示の単位を nsec・usec・msec・sec から選ぶ
-p(–process) 経過時間ではなく、そのプロセスのCPU時間(time.process_time())で測る
-t T(–target-time) 回数を自動で決めるときの目標時間(既定0.2秒、Python 3.15から)
-v(–verbose) 各セットの生の値も表示する
-h(–help) 使い方を表示する
$ python3 -m timeit -n 1000 -r 3 "sum(range(100))"
1000 loops, best of 3: 268 nsec per loop

1回が重い処理を測るときは、-n で回数を小さく決めておくと待ち時間を読みやすくなります。

2つの書き方を比べる

コマンドラインの使いどころは、「どちらが速いか」をその場で確かめることです。

$ python3 -m timeit '"-".join(str(n) for n in range(100))'
50000 loops, best of 5: 5.35 usec per loop

$ python3 -m timeit '"-".join(map(str, range(100)))'
50000 loops, best of 5: 4.51 usec per loop

この環境では map() を使うほうが速いという結果になりました。差が小さいときは、何度か実行して逆転しないかを確認してください。

クォートは外と内で使い分ける

コードの中で " を使うなら、外側を ' で囲みます。逆にしても構いません。同じ種類のクォートを入れ子にすると、シェルがコードの途中で文字列を切ってしまいます。クォートが複雑になってきたら、次の節のようにコードをファイルに書いて -s で読み込むほうが確実です。

-s で準備を計測から外す

データを作る時間まで測ってしまうと、本当に知りたい処理の速さが分かりません。準備は -s に書きます。

$ python3 -m timeit -s "data = list(range(10000))" "9999 in data"
5000 loops, best of 5: 60.4 usec per loop

$ python3 -m timeit -s "data = set(range(10000))" "9999 in data"
20000000 loops, best of 5: 16.2 nsec per loop

リストの in は先頭から順に探し、集合(set)の in はハッシュで探すため、要素が1万個あるとこれだけの差になります。単位が usec と nsec で違う点に注意してください(後述)。

乱数のデータを使うときも -s で作ります。

$ python3 -m timeit -s "import random; nums = [random.random() for _ in range(1000)]" "sorted(nums)"
10000 loops, best of 5: 32.7 usec per loop

自作の関数を測る

関数をファイルに書き、-s で import します。次の myapp.py をカレントディレクトリに置いた例です。

def fib(n):
    return n if n < 2 else fib(n - 1) + fib(n - 2)
$ python3 -m timeit -s "from myapp import fib" "fib(20)"
500 loops, best of 5: 434 usec per loop

複数行のコードを測る

引数を並べると、1つずつが1行として扱われます。

$ python3 -m timeit "x = 0" "for i in range(100): x += i"
200000 loops, best of 5: 1.24 usec per loop

インデントが必要なコードは、クォートの中で改行と空白を入れれば動きます。

$ python3 -m timeit "
for i in range(10):
    if i % 2:
        pass
"
2000000 loops, best of 5: 192 nsec per loop

ただし読みにくく、打ち間違えると SyntaxError になります(たとえば python3 -m timeit "print(" は SyntaxError: '(' was never closed)。数行を超えるなら関数にしてファイルへ移してください。

単位の読み間違いに注意

表示の単位は、結果の大きさに応じて自動で切り替わります。

表示 読み方 1秒との関係
nsec ナノ秒 10億分の1秒
usec マイクロ秒 100万分の1秒
msec ミリ秒 1000分の1秒
sec 秒 1秒

「279 nsec」と「2.39 usec」を数字だけで比べると前者が遅く見えますが、実際は後者のほうが約8.5倍遅い計算です。比べる結果の単位をそろえたいときは -u を使います。

$ python3 -m timeit -u usec "sum(range(100))"
1000000 loops, best of 5: 0.277 usec per loop

コマンドラインとPythonから呼ぶ場合の違い

項目 python -m timeit timeit.timeit()
回数 自動で決まる(-n で指定も可) number で指定(既定100万回)
結果 1回あたりの時間を表示 合計の秒数を返す
複数セット 自動で5セット repeat() を使う
結果の加工 できない(表示のみ) 数値なので集計やグラフにできる

その場で2つの書き方を比べるならコマンドライン、結果を集計したり、いくつもの条件をまとめて測ったりするならPythonから呼ぶ方法が向いています。後者はPython timeit.timeit()とは?とPython timeit.repeat()とは?で解説しています。

なお、timeit が向いているのは短いコードの比較です。プログラム全体の所要時間を測るならtime.perf_counter()を使い、どこが遅いか分からない段階では cProfile のようなプロファイラで当たりを付けてから timeit で比べる、という順番が効率的です。

よくある質問

Q. python -m timeit の結果の「best of 5」とは何ですか?

同じ回数の実行を5セット行い、そのうち最も速かったセットの結果を表示している、という意味です。セット数は -r で変えられます。

Q. 表示される時間は合計ですか、1回あたりですか?

1回あたりです。「279 nsec per loop」なら1回279ナノ秒です。Pythonのコードから呼ぶ timeit.timeit() は合計の秒数を返すので、混同しないようにしてください。

Q. 準備の処理を計測に含めないにはどうしますか?

-s に書きます。たとえば python3 -m timeit -s “data = list(range(10000))” “9999 in data” とすると、リストを作る処理は最初に1回だけ実行され、計測には含まれません。

Q. 自作の関数を測るにはどうしますか?

関数をファイル(例:myapp.py)に書き、python3 -m timeit -s “from myapp import fib” “fib(20)” のように -s で import してから呼び出します。

Q. -t オプションが使えないのはなぜですか?

-t(–target-time)は Python 3.15 で追加されたオプションなので、3.14 以前では使えません。python3 –version でバージョンを確認してください。

あわせて読みたい

対面・無料|東京・永田町で毎週土曜日13時

1回の参加で、プログラミングの構造がわかる

ゼロからはじめるPython入門講座

8年間・累計600回開催/これまで全国で2万人以上が参加

「やはり対面で聞けるのはとても気づきがあり、価値があると思います」

参加者の声

  • 本当に初心者からの講座です。プログラミングに触ったことがなくて大丈夫です
  • 対面だから、その場で聞けます。つまずいた所を持ち帰らずに解決できます
  • 講座は1時間。そのあとも残って学習を続けられ、講師にも質問できます
  • 独学で挫折した方も。糸口が見つかって、講座のあと会員になる方が多くいます

無料で参加する|開催日程を見る

参加費は無料です