Pythonの%timeitとは何ですか?


96

私はいつも次のように時間を計算するためにコードを読みます:

%timeit function()

ここで「%」の意味を説明していただけますか?

「%」は常に文字列内の何かを置き換えるために使用されると思います。たとえば、%sは文字列を置き換えることを意味し、%dはデータを置き換えることを意味しますが、この場合についてはわかりません。


16
これはiPythonの魔法のコマンドです。参照:iPython Magics
MrAlexBailey 2015年

回答:


91

%timeitipythonの魔法の関数であり、特定のコードの時間を計るために使用できます(単一の実行ステートメントまたは単一のメソッド)。

ドキュメントから:

%timeit

Time execution of a Python statement or expression

Usage, in line mode:
    %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement

これを使用するには、たとえば、使用xrangeする方が使用するよりも速いかどうかを確認したい場合はrange、次のようにするだけです。

In [1]: %timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop

In [2]: %timeit for _ in xrange(1000): True
10000 loops, best of 3: 29.6 µs per loop

そして、あなたはそれらのタイミングを取得します。

の主な利点は次の%timeitとおりです。

  • 標準ライブラリからインポートする必要はなく、コードを複数回実行して、どちらがより良いアプローチであるかを判断する必要はありませんtimeit.timeit

  • %timeitは、合計2秒の実行ウィンドウに基づいて、コードに必要な実行数を自動的に計算します。

  • またtimeit.timeit、timeitが機能する別の環境でビルドされる変数をビルドする場合のように、コードスニペット全体を渡さずに現在のコンソール変数を利用することもできます。


1
ipythonシェルからマクロまたは行のセットの時間を計る方法はありますか?
alpha_989 2017

2
@ alpha_989はい、関数内でこれらの行のセットをラップしてから、次のように関数の時間を計ることができます。%timeit function()
mu無2018年

@mu無:明確にしてくださいtimer.timeit-それは実際のモジュール名ですか?
水源


出力10000 loops, best of 3: 29.6 µs per loopは次のように解釈できます。(1。)式を10000回実行して合計時間を取得します(2.)次に合計時間を10000で割って「ループごと」の時間を取得し、(3。)合計時間を計算します3回、最後に(4.)合計3回のうち、最小合計時間(別名「ベストオブ3」)が出力として使用されます。私の解釈は正しいですか、はい/いいえ?
トレバーボイドスミス

37

これは、iPythonではラインマジックとして知られています。それらは、引数が現在の行の終わりまでしか拡張されないという点で独特であり、魔法自体は実際にはコマンドライン開発用に構造化されています。 timeitコードの実行時間を計るために使用されます。

使用できるすべての魔法を確認したい場合は、次のように入力するだけです。

%lsmagic

ラインマジックとセルマジックの両方のリストを取得します。

ここのドキュメントからのいくつかのさらなる魔法の情報:

IPythonには、Pythonの構文に直交し、ユーザーが新しいコマンドで拡張できるミニコマンド言語を効果的に提供する、マジックと呼ばれるコマンドシステムがあります。マジックはインタラクティブに入力することを目的としているため、引数を区切るための空白、オプションのダッシュ、およびコマンドライン環境で一般的なその他の規則など、コマンドラインの規則を使用します。

ラインモードかセルモードかに応じて、を使用する2つの異なる方法があります%timeit。あなたの質問は最初の方法を示しています:

In [1]: %timeit range(100)

対。

In [1]: %%timeit 
      : x = range(100)
      :


2

%timeitを使用してmu無答えるもう1つの便利な利点を追加したいと思います

  • あなたはまた、現在のコンソール変数を利用することができますはtimeitが機能することを別の環境には、内蔵されて構築された変数にtimeit.timeitの場合のように全体のコードスニペットを通過せず。

PS:これは上記のコメントになるはずですが、現在のところ十分な評判がありません。私が書いたものが誰かに役立ち、次回コメントするのに十分な評判を得るのに役立つことを願っています。


1
他の人の回答を編集して改善することもできます。あなたはすでにそれについて十分な評判を持っているはずです
TarickWelling19年

おかげでそれを知りませんでした。@TarickWelling
AnkitAgrawal19年

2

%% timeitについて非常に微妙な点を追加したかっただけです。セルで「魔法」を実行すると、エラーが発生します...

UsageError:ラインマジック関数%%timeitが見つかりません

... %% timeitより上にコード/コメント行がある場合。つまり、%% timeitがセルの最初のコマンドであることを確認してください。

私はそれがすべての専門家が当たり前だと言う小さなポイントであることを知っていますが、魔法のトリックから始める若いウィザードのために私の0.5セントを追加したかっただけです。


1
これはiPythonシェルには適用されず、Jupyterノートブックにのみ適用されます
snakecharmerb

0

行マジックには接頭辞文字が付いており、OSコマンドライン呼び出しと同じように機能します。引数として行の残りの部分を取得し、引数は括弧や引用符なしで渡されます。セルマジックの接頭辞はdouble %%であり、これらは、行の残りの部分だけでなく、その下の行も別の引数で引数として取得する関数です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.