このチュートリアルでは、Python の timeit モジュールの timeit 関数の使用方法を学びます。 Python で単純な式と関数の時間を計測する方法を学びます。
コードのタイミングを計測すると、コードの実行時間を見積もることができ、最適化が必要なコードのセクションを特定することもできます。
まず、Python の
timeit
関数の構文を学習します。次に、Python モジュール内のコードと関数のブロックの時間を計測するためにこれを使用する方法を理解するためにコード例を示します。さぁ、始めよう。
Python timeit 関数の使用方法
timeit
モジュールは Python 標準ライブラリの一部であり、インポートできます。
import timeit
timeit
モジュールから
timeit
関数を使用する構文は次のとおりです。
timeit.timeit(stmt, setup, number)
ここ:
-
stmtは、実行時間を測定するコード部分です。単純な Python 文字列または複数行の文字列として指定することも、呼び出し可能オブジェクトの名前を渡すこともできます。 -
名前が示すように、
setup、stmt実行するための前提条件として、1 回だけ実行する必要があるコード部分を示します。たとえば、NumPy 配列の作成の実行時間を計算しているとします。この場合、numpyのインポートはsetupコードであり、実際の作成は時間を測定するステートメントです。 -
パラメータ
numberstmtが実行される回数を示します。numberのデフォルト値は 100 万 (1000000) ですが、このパラメータを任意の他の値に設定することもできます。
timeit()
関数を使用する構文を学習したので、いくつかの例のコーディングを開始しましょう。
単純な Python 式のタイミング
このセクションでは、timeit を使用して単純な Python 式の実行時間を測定してみます。
Python REPL を開始し、次のコード例を実行します。ここでは、10000 回と 100000 回の実行について、べき乗演算とフロア除算演算の実行時間を計算しています。
時間を計測するステートメントを Python 文字列として渡し、セミコロンを使用してステートメント内のさまざまな式を区切っていることに注意してください。
>>> import timeit
>>> timeit.timeit('3**4;3//4',number=10000)
0.0004020999999738706
>>> timeit.timeit('3**4;3//4',number=100000)
0.0013780000000451764
コマンドラインでPython timeitを実行する
コマンドラインで
timeit
使用することもできます。 timeit 関数呼び出しと同等のコマンドラインを次に示します。
$ python-m timeit -n [number] -s [setup] [stmt]
-
python -m timeit、timeitメインモジュールとして実行することを表します。 -
nは、コードを実行する回数を示すコマンドライン オプションです。これは、timeit()関数呼び出しのnumber引数に相当します。 -
オプション
-sを使用してセットアップ コードを定義できます。
ここでは、同等のコマンドラインを使用して前の例を書き直します。
$ python -m timeit -n 100000 '3**4;3//4'
100000 loops, best of 5: 35.8 nsec per loop
この例では、組み込みの
len()
関数の実行時間を計算します。文字列の初期化は、
s
オプションを使用して渡されるセットアップ コードです。
$ python -m timeit -n 100000 -s "string_1 = 'coding'" 'len(string_1)'
100000 loops, best of 5: 239 nsec per loop
出力では、
5 回の実行のうち最良の
実行時間を取得していることに注目してください。これはどういう意味ですか?コマンド ラインで
timeit
実行すると、
repeat
オプション
r
は
デフォルト
値の 5 に設定されます。これは、指定された
number
の
stmt
の実行が 5 回繰り返され、実行時間のうち最良のものが返されることを意味します。
timeit を使用した文字列反転メソッドの分析
Python 文字列を操作する場合、文字列を逆にしたい場合があります。文字列を反転する最も一般的な 2 つのアプローチは次のとおりです。
- 文字列スライスの使用
-
reversed()関数とjoin()メソッドの使用
文字列スライスを使用して Python 文字列を反転する
文字列スライスの仕組みと、それを使用して Python 文字列を反転する方法を見てみましょう。構文
some-string[start:stop]
を使用すると、インデックス
start
から始まりインデックス
stop-1
までの文字列のスライスが返されます。例を挙げてみましょう。
次の文字列「Python」について考えてみましょう。文字列の長さは 6 で、インデックスのリストは 0、1、2 から 5 までです。
>>> string_1 = 'Python'
start
と
stop
値の両方を指定すると、
start
から
stop-1
までにわたる文字列スライスが取得されます。したがって、
string_1[1:4]
「yth」を返します。
>>> string_1 = 'Python'
>>> string_1[1:4]
'yth'
start
値を指定しない場合、デフォルトの
start
値 0 が使用され、スライスはインデックス 0 から始まり
stop - 1
まで拡張されます。
ここでは、
stop
値は 3 であるため、スライスはインデックス 0 から始まり、インデックス 2 まで進みます。
>>> string_1[:3]
'Pyt'
stop
インデックスを含めない場合、スライスは
start
インデックス (1) から始まり、文字列の終わりまで続くことがわかります。
>>> string_1[1:]
'ython'
start
値と
stop
値の両方を無視すると、文字列全体のスライスが返されます。
>>> string_1[::]
'Python'
step
値を使用してスライスを作成しましょう。
start
、
stop
、
step
値をそれぞれ 1、5、2 に設定します。 1 から始まり、2
番目
ごとの文字を含む 4 までの文字列のスライス (終点 5 を除く) を取得します。
>>> string_1[1:5:2]
'yh'
負のステップを使用すると、文字列の終わりから始まるスライスを取得できます。ステップを -2 に設定すると、
string_1[5:2:-2]
次のスライスを生成します。
>>> string_1[5:2:-2]
'nh'
したがって、文字列の反転コピーを取得するには、次のよう
start
と
stop
値をスキップし、ステップを -1 に設定します。
>>> string_1[::-1]
'nohtyP'
要約すると、
string[::-1]文字列の反転コピーを返します。
組み込み関数と文字列メソッドを使用した文字列の反転
Python の組み込み
reversed()
関数は、文字列の要素に対する逆反復子を返します。
>>> string_1 = 'Python'
>>> reversed(string_1)
<reversed object at 0x00BEAF70>
したがって、for ループを使用して逆反復子をループできます。
for char in reversed(string_1):
print(char)
そして、逆の順序で文字列の要素にアクセスします。
# Output
n
o
h
t
y
P
次に、構文
<sep>.join(reversed(some-string))
使用して、逆反復子で
join()
メソッドを呼び出すことができます。
以下のコード スニペットは、区切り文字がそれぞれハイフンと空白であるいくつかの例を示しています。
>>> '-'.join(reversed(string1))
'n-o-h-t-y-P'
>>> ' '.join(reversed(string1))
'n o h t y P'
ここでは区切り文字は必要ありません。したがって、区切り文字を空の文字列に設定して、文字列の反転コピーを取得します。
>>> ''.join(reversed(string1))
'nohtyP'
''.join(reversed(some-string))を使用すると、文字列の逆コピーが返されます。
timeit を使用した実行時間の比較
これまで、Python 文字列を逆にする 2 つのアプローチを学習しました。 しかし、どちらが速いでしょうか? 確認してみましょう。
単純な Python 式の時間を測定した前の例では、
setup
コードがありませんでした。ここでは、Python 文字列を逆にしています。文字列反転操作は、
number
で指定された回数だけ実行されますが、
setup
コードは 1 回だけ実行される文字列の初期化です。
>>> import timeit
>>> timeit.timeit(stmt = 'string_1[::-1]', setup = "string_1 = 'Python'", number = 100000)
0.04951830000001678
>>> timeit.timeit(stmt = "''.join(reversed(string_1))", setup = "string_1 = 'Python'", number = 100000)
0.12858760000000302
指定された文字列を反転するための同じ回数の実行の場合、
文字列スライスの
アプローチは、
join()
メソッドや
reversed()
関数を使用するよりも高速です。
Python でリストを反転して逆方向にスピンする方法もお読みください。
timeit を使用した Python 関数のタイミング
このセクションでは、timeit 関数を使用して Python 関数の時間を計測する方法を学びましょう。文字列のリストを指定すると、次の関数
hasDigit
少なくとも 1 つの数字を持つ文字列のリストを返します。
def hasDigit(somelist):
str_with_digit = []
for string in somelist:
check_char = [char.isdigit() for char in string]
if any(check_char):
str_with_digit.append(string)
return str_with_digit
ここで、
timeit
を使用して、この Python 関数
hasDigit()
の実行時間を測定したいと思います。
まず、時間を測定するステートメント (
stmt
) を特定しましょう。これは、文字列のリストを引数として持つ関数
hasDigit()
の呼び出しです。次に、
セットアップ
コードを定義しましょう。
setup
コードが何であるべきかわかりますか?
関数呼び出しを正常に実行するには、セットアップ コードに次のものが含まれている必要があります。
-
関数の定義
hasDigit() - 文字列の引数リストの初期化
以下に示すように、
setup
文字列でセットアップ コードを定義しましょう。
setup = """
def hasDigit(somelist):
str_with_digit = []
for string in somelist:
check_char = [char.isdigit() for char in string]
if any(check_char):
str_with_digit.append(string)
return str_with_digit
thislist=['puffin3','7frost','blue']
"""
次に、
timeit
関数を使用して、100000 回の実行に対する
hasDigit()
関数の実行時間を取得できます。
import timeit
timeit.timeit('hasDigit(thislist)',setup=setup,number=100000)
# Output
0.2810094920000097
結論
Python の timeit 関数 を使用して、式、関数、その他の呼び出し可能オブジェクトの時間を計測する方法を学習しました。これは、コードのベンチマークを行ったり、同じ関数のさまざまな実装の実行時間を比較したりするのに役立ちます。
このチュートリアルで学んだことを復習しましょう。
timeit()
関数
timeit.timeit(stmt=...,setup=...,number=...)
構文で使用できます。あるいは、コマンド ラインで timeit を実行して、短いコード スニペットの時間を計測することもできます。
次のステップとして、line-profiler や memprofiler などの他の Python プロファイリング パッケージを使用して、コードの時間とメモリをそれぞれプロファイリングする方法を検討できます。
次に、Python で時差を計算する方法を学びます。






![2021 年に Raspberry Pi Web サーバーをセットアップする方法 [ガイド]](https://i0.wp.com/pcmanabu.com/wp-content/uploads/2019/10/web-server-02-309x198.png?w=1200&resize=1200,0&ssl=1)





