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 でバージョンを確認してください。



