始める無料で始める

デコレータのオーバーヘッドを測る

あなたの上司は check_everything() というデコレータを作り、とても優れていると主張しており、あなたの関数にも使うよう強く勧めています。しかし、このデコレータで関数を装飾すると実行がかなり遅くなることに気づきました。デコレータが処理時間をかけ過ぎていることを上司に納得してもらう必要があります。そのために、装飾済み関数の実行時間を測り、装飾しない場合にかかる時間と比較します。問題のデコレータは次のとおりです。

def check_everything(func):
  @wraps(func)
  def wrapper(*args, **kwargs):
    check_inputs(*args, **kwargs)
    result = func(*args, **kwargs)
    check_outputs(result)
    return result
  return wrapper

この演習はコースの一部です

Python関数の書き方

コースを見る

演習の手順

  • 上司のデコレータ内の wraps() 文によって装飾済み関数に追加された属性を使い、装飾版ではなく元の関数を呼び出してください。

実践的なインタラクティブ演習

このサンプルコードを完成させて、この演習に挑戦してみましょう。

@check_everything
def duplicate(my_list):
  """Return a new list that repeats the input twice"""
  return my_list + my_list

t_start = time.time()
duplicated_list = duplicate(list(range(50)))
t_end = time.time()
decorated_time = t_end - t_start

t_start = time.time()
# Call the original function instead of the decorated one
duplicated_list = duplicate.____(list(range(50)))
t_end = time.time()
undecorated_time = t_end - t_start

print('Decorated time: {:.5f}s'.format(decorated_time))
print('Undecorated time: {:.5f}s'.format(undecorated_time))
コードを編集して実行