【Python】デコレータを使って関数の実行時間を計測する

f:id:Medicmed:20180625095221p:plain

今回はデコレータについて記事にしたいと思います。
使用する関数は過去記事で作った関数にします。

デコレータで関数の処理を装飾する!

デコレータとは関数の処理を装飾するための仕組みです。
デコレータを使用することによって、手軽に関数の前後に任意の処理を付け加えることができます。
「@」という指定をしてほかの関数に機能を追加でき、デコレータとして指定された関数は、機能を追加される関数を「実引数」として受け取ります。

完成したコードはコチラ!

import time,PyPDF2,os,sys,requests,webbrowser,bs4
def time_log(func) :
def wrapper(*args, **kwargs) :
start = time.time()
print("-"*5,"start", func.__name__, "-"*5)
result = func(*args, **kwargs)
end = time.time()
delta = round(end - start,2)
print("-"*5,"end", func.__name__ ,delta,"sec","-"*5)
return wrapper
@time_log
def combine_pdf() :
path = input("PATHを入力してください \nPATH:")
print('Combining PDFs...')
pdf_files = []
base = os.getcwd()
for filename in os.listdir(base + "/" + path) :
if filename.lower().endswith('.pdf') :
pdf_files.append(filename)
pdf_files.sort(key=str.lower)
pdf_writer = PyPDF2.PdfFileWriter()
os.chdir(base + "/" + path)
i = 0
for filename in pdf_files :
pdf_file_obj = open(filename, 'rb')
pdf_reader = PyPDF2.PdfFileReader(pdf_file_obj)
title = pdf_reader.getPage(0)
pdf_writer.insertPage(title,index=i)
i +=1
for page_num in range(pdf_reader.numPages) :
page_obj = pdf_reader.getPage(page_num)
pdf_writer.addPage(page_obj)
pdf_output = open('All.pdf', 'wb')
pdf_writer.write(pdf_output)
pdf_output.close()
print('Nailed it!')
@time_log
def guess() :
import random
print('Let\'s learn Try and Except Statements')
print('='*5 + ' This program is going to run ' + '='*5)
print('I am thinking of a number between 1 and 20.')
secret = random.randint(1,20)
for guesses in range(1,5) :
print('Take a guess.')
try :
Number = int(input())
except ValueError :
print('You did not enter a number.')
print('Try again.')
continue
if Number < secret :
print('Your guess is too low.')
elif Number > secret :
print('Your guess is too high.')
else :
break  # if-elif and else statement
if Number == secret :
print('Nailed it, you guessed my number in ' + str(guesses) + ' guesses.')
else :
print('The number I was thinking of was ' + str(secret))
print('='*6 + ' This program is done ' + '='*12)

プログラムが完成したので実行してみたいと思います。

Pythonを起動させて実行する!

pythonファイルにしているので、importして使用することができます。
f:id:Medicmed:20180625144818p:plain

import deco_time as dec

としたdeco_time.pyファイルをインポートします。
deco_time.pyの中にある、guess()関数を使用するには”dec.guess()”とします。

guess()関数を実行する!

f:id:Medicmed:20180625145135p:plain
適当に数字を予想していきます。
プログラムが終了すると、実行時間を表示してくれます。
画面をキャプチャしていたりしたので30秒ぐらいかかっています。
次は、指定したフォルダのPDFをすべて1つにまとめてくれる関数を実行します。

combine_pdf()関数を実行する!

f:id:Medicmed:20180625145812p:plain
厚労省フォルダの論文フォルダに入っているPDFファイルを1つにまとめるので、そこのPATHを書きます。

f:id:Medicmed:20180625150236p:plain
Enterを押すと、同じようにPDFファイルを結合するまでの時間を表示してくれます。

f:id:Medicmed:20180625150312p:plain

デコレータを勉強する際には、ぜひ参考にしてみてください。
終わり。

今回参考にした書籍はコチラ!

実践力を身につける Pythonの教科書

実践力を身につける Pythonの教科書

Pythonで学ぶあたらしい統計学の教科書

Pythonで学ぶあたらしい統計学の教科書

統計学を本格的に勉強したい方向け!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください