では､ デコレーターの実用的な使い方についてお話しましょう｡
というか､ すでに授業で見たことありますよね？
クラスメソッドとスタティックメソッドについて見てきましたが､ クラスメソッドとスタティックメソッドは､ 直接のクラスが使用できるように作成することができます｡
そして､ これらを覚えていない人は､ それらのビデオを見返せばいいのです｡
でも､ 私が好きなデコラティブな例をひとつ紹介したい｡
自分たちで作るんだ｡
これからやることは､ パフォーマンスをしたいんです｡
装飾家｡
ちなみに､ このデコレーターはPythonには存在しない｡
ゼロから作るんです｡
私がやりたいのは､ 自分のコードをテストするときに使って､ コードの実行速度を確認するためのパフォーマンス・デコレーターを持つことです｡
例えば､ ある関数があったとして､ それにかかる時間が長いとする｡
まあ､ 完成までの時間が長いこと｡
だから､ 本当に長いループをして､ 例えば､ Iの範囲に言ってみる｡
これだけの数字を､ 適当に計算すると......5倍｡
この機能
どれくらいの性能で､ 何ミリ秒でこれが完了するのか､ 知りたいのです｡
では､ どのようにベルトを巻けばいいのでしょうか｡
まず､ まだ話していないことですが､ モジュールとビルトインモジュールについて何かします｡
ということで､ とりあえず､ あまり多くは語りませんが､ timeモジュールからwell timeというものをインポートしてみます｡
ここでも､ コースのモジュールセクションでお話することです｡
私は本質的に､ 私がPythonをインストールしたとき､ あるいは私の場合はこのリップルを使っているとき､ 私が要求すればこの時間にアクセスできますよ､
ということを言いたいのです｡
この場合､ Pythonから取得したこの時間オブジェクトやモジュールを使いたいんだ､ と言っているんです｡
そして､ ここでは､ 学んだパターンに従って､ デコレーターを作成します｡
パフォーマンスを定義する､ ということです｡
そしてパフォーマンスは､ これまでと同じように関数を受け付けることになる｡
そして､ この中に､ ラッパーを入れます｡
そこで､ ラッパー関数とラッパー関数としましょう｡
思い起こせば､ 星のアークや星のキーワードのアークを取り込むことで､ 柔軟に対応できそうですね｡
この関数がどのように､ いくつのパラメータを持つか分からないので､ 好きなだけパラメータを渡すことができるようにします｡
そして､ すべての機能でパフォーマンスを発揮できるようにしたい｡
さて､ ここではまず､ 関数の結果を用意します｡
であること｡
ここで受け取った機能､ そしてシンプルに言う｡
星型引数､ 星型キーワードのアークで関数を実行します｡
そして最後に､ この結果を返したいと思います｡
そして､ 最後にラッパーを返します｡
だから､ 今まで見たことがないものはない｡
ここでreturnするだけでも､ 関数を実行するだけでもよかったのですが､ なぜこのような方法をとったかは､ 後ほど紹介します｡
今のところ､ この機能は何もしていないんです｡
実行」をクリックすると
まあ､ 長時間やっても何も起こらないし､ この関数を実行しても何も起こらないんだけどね｡
ただ､ 動作に時間がかかりました｡
でも､ それだけなんです｡
何も起こらない｡
この時､ 私たちは面白くするのです｡
この関数の実行開始から終了までを計算したいのですが､ これにはtimeモジュールが使えます｡
スタート時に可変のタイムワンを作って､ 単純にタイムと言えばいいんです｡
そこで､ このタイムファンクションを起動させているのです｡
ある時期から､ おいおい､ この初回はPT1になるぞと｡
そして､ この関数の後に､ 私たちのメイン関数であるlongtimeが実行されるのです｡
T 2と言いながら､ 「おい､ 何時だ？
今すぐ
そこで今回は､ 今が何時なのかを確認します｡
そして､ この関数を実行すると､ 今度は時間をチェックすることになります｡
そして､ この2つの間にどれだけの差があるかというと､ この部分にどれだけの時間がかかったかということです｡
そうですね｡
つまり､ Fの文字列をプリントして､ T1マイナスT2がかかったと言うだけです｡
そうですね｡
そして､ これは実際にはミリ秒単位で返されます｡
だから､ ミリ単位でGMと言うことにしています｡
そして､ それだけです｡
このように､ 関数をラップして､ 関数を実行すると同時に､ かかった時間をプリントしています｡
では､ 確認してみましょう｡
ここで､ 私の長時間の関数を実行し､ 「実行」をクリックすると､ 次のようになります｡
よし､ ここで失敗したからマイナスになるんだ｡
RT 1の時間がしばらく経過してからTT 2になるので､ T 2からRT 1を引いた値になるはずです｡
だから､ TT 2はTW 1より必ず大きくなるんです｡
これを実行すると
わかりました｡
0を要した｡ 16ミリ秒｡
これ､ 実は秒殺だと思うんです｡
では､ この長い関数をさらに長くするために､ このように「実行」をクリックします｡
まいったなぁ｡
それで1がかかった｡ 9秒
実行をクリックするとさらに長くなるのですが？
そして､ この部分は､ 関数が実行されるまで私が話し続ける部分です｡ 気まずい沈黙が待っているからです｡
そうでなければ､ 他に話すことがないので､ 早く終わってほしいです｡
さあ
気まずくなってきた
よし､ こっちだ｡
まいったなぁ｡
うーん｡
ここからは早送りになります｡
まいったなぁ｡
19秒かかった｡
それは
それはかなりまずいですね｡
しかし､ このデコレーターを使えば､ プログラム中のほとんどの関数に適用して､ 関数の性能を実際に測定することができるようになるのです｡
かなり便利でしょう？
このコードを持っていて､ コードをデプロイする前に､ あるいはコードを世の中に送り出す前に､ このコードを使うことができるのです｡
自分の作った関数がどの程度のパフォーマンスなのかテストできますし､ さまざまな方法で最適化できるかもしれません｡
とても､ 便利です｡
しかも､ それをたった数行のコードで実現したのです｡
9行のコード｡
さて､ 気をつけたいのは､ このパフォーマンス・デコレーターは､ マシンと､ あなたのコンピュータのCPUとメモリの速さに依存するということです｡
ですから､ 私が19秒かかったものが､ あなたのマシンによってはもっとかかるかもしれませんし､ もっと短いかもしれません｡
でも､ これは関数を相対的に比較するいい方法なので､ この後､ デコレータの威力を実感していただければと思います｡
Pythonのライブラリやフレームワークでは､ デコレータが多く使われています｡
これから話すDjangoやFlaskのようなフレームワークはデコレータを使っています｡
もしかしたら､ 認証用のデコレーターを用意し､ ユーザーが認証された場合のみ各機能を実行できるように認証したいかもしれません｡
Webサイトにログインするなどの機能を実行する権限を持っている｡
あるいは､ ログインやロギングが必要なだけかもしれません｡
Decoratorは､ 誰かがシステムにログインしたとか､ Amazonで何か購入したとか､ そういうことをデータベースに記録して知らせるだけのものです｡
あるいは､ 「ねえ､ 今誰かが友達申請してきたんだけど｡
デコレーターの使い道はたくさんあるし､ デコレーターは難しいテーマですからね｡
Pythonのコードのあちこちで見かけることはないでしょう｡
Pythonに慣れてきたら使えるようになる追加機能です｡
しかし､ 私は､ このすべてが終わる頃には､ 少なくとも､ いつか自分自身で構築したり､ ライブラリやフレームワークによってあらかじめ構築されたものを利用したりするために､
それらを理解していることを望みます｡
次回作でお会いしましょう｡
バイバイ｡