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

Pythonアプリ

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

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

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

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

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

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

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

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

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

profile_icon

【Python歴】10年 x 【営業マン歴】11年

HP作成、社内システムの構築、コンサルティング

Pythonベースのフレームワーク 「Django」を使って下記のようなサイトを作っています!

日報アプリ
当ブログで一から開発方法を解説している日報アプリ(デモ版)です
ツールアプリ
当ブログで紹介したPythonアプリのWeb版です。DjangoAPIとReactで開発。随時更新中です。

icon
icon

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メソッドを使いましょう

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

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