【Python】時間計測アプリのコードを公開・解説|初心者向け

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2022年9月)

✔このような方へ向けて書かれた記事となります

「Pythonで時間計測ってどうやるの?」

「timeメソッドとperf_counterは何が違う?」

「コードの実例を見てみたい!」

✔当記事を通じてお伝えすること

  • Pythonのtimeメソッドを使った時間計測方法
  • Pythonのperf_counterメソッドを使った時間計測方法
  • timeメソッドとperf_counterメソッドを比較
  • 【decorator】処理計測のデコレータ実例

当記事では、単にPythonで時間計測方法をお伝えするだけでなく、簡単に自作できるアプリのコードを紹介しているので、ご自身の手で動かして試すことができます。

ぜひ最後までご覧ください。

icon
icon

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

Pythonのtimeメソッドで時間計測アプリを作る

timeメソッドを使って、時間計測が可能です。

以下の順で解説していきます。

  1. 実例コードの公開
  2. 時間計測部分の解説
  3. 実行結果

【timeメソッド】実例コードの公開

timeメソッドを使った時間計測アプリのコードはこちらです。

#!/usr/bin/env python
#coding: utf-8
import time

if __name__ == '__main__':
    ignite = input("Enterでスタート → ")
    start = time.time()
    finish = input("Enterでストップ → ")
    end = time.time()
    delta = round(end - start, 2)
    print(f"時間計測:{delta}秒")

【timeメソッド】時間計測部分の解説

時間計測の部分はこちらになります。

start = time.time()
finish = input("Enterでストップ → ")
end = time.time()
delta = round(end - start, 2)

timeメソッドで時間を取得し、差分をroundで四捨五入しています。

【timeメソッド】実行結果

実行方法は以下のとおり。(ファイル名を「python_timer.py」とします。

$ python python_timer.py
Enterでスタート → 
Enterでストップ → 
時間計測:2.29秒

Pythonのperf_counterメソッドで時間計測アプリを作る

perf_counterメソッドを使って、時間計測が可能です。

以下の順で解説していきます。

  • 実例コードの公開
  • 時間計測部分の解説
  • 実行結果

timeメソッドよりもより正確だと言われているメソッドです。

【perf_counterメソッド】実例コードの公開

perf_counterメソッドを使ったアプリのコードはこちらです。

#!/usr/bin/env python
#coding: utf-8
import time

if __name__ == '__main__':
    ignite = input("Enterでスタート → ")
    start = time.perf_counter()
    finish = input("Enterでストップ → ")
    end = time.perf_counter()
    delta = round(end - start, 2)
    print(f"時間計測:{delta}秒")

【timeメソッド】時間計測部分の解説

時間計測部分はこちら。

start = time.perf_counter()
finish = input("Enterでストップ → ")
end = time.perf_counter()
delta = round(end - start, 2)

timeメソッドの箇所をperf_counterメソッドに変えただけです。

【timeメソッド】実行結果

実行方法は以下のとおり。(ファイル名を「python_perf_counter.py」とします。

$ python python_perf_counter.py
Enterでスタート → 
Enterでストップ → 
時間計測:4.34秒

問題なく動きますね。

【timeメソッド vs perf_counter】どっちの関数が精度高いの?

timeメソッドとperf_counterメソッドの両方をご紹介しましたが、違いはあるのでしょうか?

違いがないのなら、好きなものを使えば良いでしょう。

以下のとおり2通りで試しました。

  • roundメソッド有り
  • roundメソッド無し

それぞれ見ていきましょう。

roundメソッドではミリ秒にしても違いがわからない

以下の通り、2つのメソッドを同時に実行します。

#!/usr/bin/env python
#coding: utf-8
import time

if __name__ == '__main__':
    ignite = input("Enterでスタート → ")
    start = time.time()
    perf_start = time.perf_counter()
    finish = input("Enterでストップ → ")
    end = time.time()
    perf_end = time.perf_counter()
    delta = round(end - start, 5)
    perf_delta = round(perf_end - perf_start, 5)
    print(f"時間計測(timeメソッド):{delta}秒")
    print(f"時間計測(perf_counterメソッド):{perf_delta}秒")

検証スタート。

$ python comparison.py
Enterでスタート → 
Enterでストップ → 
時間計測(timeメソッド):4.23793秒
時間計測(perf_counterメソッド):4.23793秒

roundメソッドで四捨五入すると、違いがわかりません。

roundメソッド無しでは数秒でも違いがでる

roundメソッドをなくしてみます。

#!/usr/bin/env python
#coding: utf-8
import time

if __name__ == '__main__':
    ignite = input("Enterでスタート → ")
    start = time.time()
    perf_start = time.perf_counter()
    finish = input("Enterでストップ → ")
    end = time.time()
    perf_end = time.perf_counter()
    # delta = round(end - start, 5) #roundをコメントアウト
    # perf_delta = round(perf_end - perf_start, 5)#roundをコメントアウト
    delta = end - start
    perf_delta = perf_end - perf_start
    print(f"時間計測(timeメソッド):{delta}秒")
    print(f"時間計測(perf_counterメソッド):{perf_delta}秒")

検証スタート。

$ python comparison.py
Enterでスタート → 
Enterでストップ → 
時間計測(timeメソッド):6.968681335449219秒
時間計測(perf_counterメソッド):6.968680547000076秒

差があるのがわかります。

正確さを求めるなら、推奨されているperf_counterメソッドが良さそうですね。

【decorator】処理計測のデコレータ実例

デコレータを使えば、好きな関数の処理時間を計測できます。

以下の順で解説していきます。

  • 実例コードの公開
  • デコレータ箇所のコード解説
  • 実行結果

処理時間計測デコレータのコード

こちらのコードには以下の3つが含まれています。

  1. デコレータのコード
  2. デコレータで計測したい関数のコード
  3. ファイル実行のためのコード
#!/usr/bin/env python
#coding: utf-8
import time

#1.デコレータ
def timer(func):
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        print("処理中です...")
        func(*args, **kwargs)
        end = time.perf_counter()
        print(f"かかった時間は約{round(end - start, 2)}秒です。")
    return wrapper

#2.計測したい関数です。
@timer
def looper(num):
    l = []
    for i in range(num):
        time.sleep(0.2)
        l.append(i)

#3.ファイル実行   
if __name__ == '__main__':
    num_str = input("数字を入力してください → ")
    try:
        num = int(num_str)
        if num > 100:
            print("100以下の数値を入力してください。") 
        else:
            looper(num)
    except:
            print("数字を入力してください。")

デコレータ箇所のコード解説

デコレータのコードは以下のとおり。

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        print("処理中です...")
        func(*args, **kwargs)
        end = time.perf_counter()
        print(f"かかった時間は約{round(end - start, 2)}秒です。")
    return wrapper

関数実行の前後で時間を取得し、差分を計算しています。

デコレータの実行結果

デコレータを実行しました。

$ python time_decorator.py
数字を入力してください → 15
処理中です...
かかった時間は約3.0秒です。

時間がきちんと計測されていますね。

まとめ:正確さを求めるならperf_counterメソッドがおすすめ

当記事の内容をまとめます。

  • 時間の計測には、timeメソッドかperf_counterメソッドが使える
  • perf_counterメソッドの方がより正確
  • 時間計測はデコレータにも活用できる

Pythonで時間計測をする方法は当記事のとおり。

timeモジュールのtimeメソッドか、perf_counterメソッドを使いましょう

タイトルとURLをコピーしました