Pythonデコレータの詳しい解説
Python デコレータの詳細分析
Python デコレータの詳細分析
何デコレータですか?
推奨学習: Python ビデオ チュートリアル
Python デコレータ (関数デコレータ) は、元の関数の機能を拡張するために使用される関数です。元の関数名(またはクラス名)を変更して、関数に新しい関数を追加します。
この関数の特別な点は、戻り値も関数であるということです。この関数は、「オリジナルの」関数が埋め込まれた関数です。
一般的に言えば、元の関数コードを拡張します。最も直接的な方法は、コードに侵入して変更することです。例:
import time def f(): print("hello") time.sleep(1) print("world")
これは最もオリジナルな関数であり、合計を記録しようとします。この関数の実行時間を考慮すると、最も簡単な方法は元のコードを変更することです:
import time def f(): start_time = time.time() print("hello") time.sleep(1) print("world") end_time = time.time() execution_time = (end_time - start_time)*1000 print("time is %d ms" %execution_time)
ただし、実際の作業では、コア コードを直接変更できない場合があるため、元のコードを変更せずに, we 別の関数を定義できます (ただし、有効にするために関数を再度実行する必要があります)
import time def deco(func): start_time = time.time() f() end_time = time.time() execution_time = (end_time - start_time)*1000 print("time is %d ms" %execution_time) def f(): print("hello") time.sleep(1) print("world") if __name__ == '__main__': deco(f) print("f.__name__ is",f.__name__) print()
ここでは、パラメータが関数である関数 deco を定義し、埋め込みます。タイミング関数を this function に追加します。しかし、これらの数千万の関数の関数を拡張したい場合、
は deco() 関数を 1000 万回実行することを意味するため、これは理想的ではありません。それを達成するためにデコレータを使用してみてください。まず、デコレータの最もオリジナルな外観を見てください。
import time def deco(f): def wrapper(): start_time = time.time() f() end_time = time.time() execution_time = (end_time - start_time)*1000 print("time is %d ms" %execution_time ) return wrapper @deco def f(): print("hello") time.sleep(1) print("world") if __name__ == '__main__': f()
ここでの deco 関数は、最もオリジナルなデコレータです。そのパラメータは関数です。
関数 f() をパラメータとして、戻り関数 Wrapper() 内で実行され、関数 f() の前に @deco を追加します。 ##f() 関数は注入されるのと同じです タイミング関数を使用すると、f() が呼び出される限り、関数は「より多くの関数を備えた新しい関数」、
に変換されます (注入する必要はありません)元の関数を繰り返します).
拡張 1: 固定パラメーターを使用したデコレーター
import time def deco(f): def wrapper(a,b): start_time = time.time() f(a,b) end_time = time.time() execution_time = (end_time - start_time)*1000 print("time is %d ms" % execution_time) return wrapper @deco def f(a,b): print("be on") time.sleep(1) print("result is %d" %(a+b)) if __name__ == '__main__': f(3,4)
拡張 2: 固定パラメーターを使用しないデコレーター
import time def deco(f): def wrapper(*args, **kwargs): start_time = time.time() f(*args, **kwargs) end_time = time.time() execution_time_ = (end_time - start_time)*1000 print("time is %d ms" %execution_time) return wrapper @deco def f(a,b): print("be on") time.sleep(1) print("result is %d" %(a+b)) @deco def f2(a,b,c): print("be on") time.sleep(1) print("result is %d" %(a+b+c)) if __name__ == '__main__': f2(3,4,5) f(3,4)
拡張 3: を使用します。関数を装飾するための複数のデコレータ
import time def deco01(f): def wrapper(*args, **kwargs): print("this is deco01") start_time = time.time() f(*args, **kwargs) end_time = time.time() execution_time = (end_time - start_time)*1000 print("time is %d ms" % execution_time) print("deco01 end here") return wrapper def deco02(f): def wrapper(*args, **kwargs): print("this is deco02") f(*args, **kwargs) print("deco02 end here") return wrapper @deco01 @deco02 def f(a,b): print("be on") time.sleep(1) print("result is %d" %(a+b)) if __name__ == '__main__': f(3,4)
''' this is deco01 this is deco02 hello,here is a func for add : result is 7 deco02 end here time is 1003 ms deco01 end here '''
デコレータの呼び出し順序
デコレータは重ねて使用できるため、デコレータを使用した後のコードの順序はどうなりますか?
「 Python Sugar の @" 構文では、デコレーターが呼び出される順序は、@ 構文 Sugar を使用して宣言された順序の逆になります。
この例では、"f(3, 4) = deco01(deco02( f(3, 4)))"。
Python 組み込みデコレータ
Python には 3 つの組み込みデコレータがあります。クラスに関連するもの: staticmethod、classmethod、property 。
staticmethod はクラスの静的メソッドです。メンバー メソッドとの違いは、self パラメータがなく、クラスをインスタンス化せずに呼び出すことができることです。
クラスメソッドとメンバーメソッドの違いは、受け取った最初のパラメータがself(クラスインスタンスへのポインタ)ではなく、cls(現在のクラスの特定の型)であることです。
propertyはプロパティを意味し、次の情報を示します。クラス インスタンスを通じて直接アクセスできます
ここでは staticmethod と classmethod は紹介しませんので、例を通してプロパティを見てみましょう。
Python の新しいスタイルのクラスの場合、上記の "@var.setter" デコレーターによって装飾されたメンバー関数が削除されると、Foo になることに注意してください。var 属性は読み取りです。 -only 属性であり、「foo.var = 'var 2'」を使用して値を割り当てると例外がスローされます。ただし、Python クラシック クラスの場合、宣言された属性は読み取り専用ではないため、「@var.setter」デコレータが削除されてもエラーは報告されません。
この記事では、Python デコレーターの使用法をいくつか紹介します。デコレーターのコードは比較的理解しやすいものです。いくつかの例を通して実践すれば理解するのは簡単です。
以上がPythonデコレータの詳しい解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

CentOSシステムでのPytorchモデルの効率的なトレーニングには手順が必要であり、この記事では詳細なガイドが提供されます。 1。環境の準備:Pythonおよび依存関係のインストール:Centosシステムは通常Pythonをプリインストールしますが、バージョンは古い場合があります。 YumまたはDNFを使用してPython 3をインストールし、PIP:sudoyumupdatepython3(またはsudodnfupdatepython3)、pip3install-upgradepipをアップグレードすることをお勧めします。 cuda and cudnn(GPU加速):nvidiagpuを使用する場合は、cudatoolをインストールする必要があります

Pytorch GPUアクセラレーションを有効にすることで、CentOSシステムでは、PytorchのCUDA、CUDNN、およびGPUバージョンのインストールが必要です。次の手順では、プロセスをガイドします。CUDAおよびCUDNNのインストールでは、CUDAバージョンの互換性が決定されます。NVIDIA-SMIコマンドを使用して、NVIDIAグラフィックスカードでサポートされているCUDAバージョンを表示します。たとえば、MX450グラフィックカードはCUDA11.1以上をサポートする場合があります。 cudatoolkitのダウンロードとインストール:nvidiacudatoolkitの公式Webサイトにアクセスし、グラフィックカードでサポートされている最高のCUDAバージョンに従って、対応するバージョンをダウンロードしてインストールします。 cudnnライブラリをインストールする:

DockerはLinuxカーネル機能を使用して、効率的で孤立したアプリケーションランニング環境を提供します。その作業原則は次のとおりです。1。ミラーは、アプリケーションを実行するために必要なすべてを含む読み取り専用テンプレートとして使用されます。 2。ユニオンファイルシステム(UnionFS)は、違いを保存するだけで、スペースを節約し、高速化する複数のファイルシステムをスタックします。 3.デーモンはミラーとコンテナを管理し、クライアントはそれらをインタラクションに使用します。 4。名前空間とcgroupsは、コンテナの分離とリソースの制限を実装します。 5.複数のネットワークモードは、コンテナの相互接続をサポートします。これらのコア概念を理解することによってのみ、Dockerをよりよく利用できます。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

CentOSでPytorchバージョンを選択する場合、次の重要な要素を考慮する必要があります。1。CUDAバージョンの互換性GPUサポート:NVIDIA GPUを使用してGPU加速度を活用したい場合は、対応するCUDAバージョンをサポートするPytorchを選択する必要があります。 NVIDIA-SMIコマンドを実行することでサポートされているCUDAバージョンを表示できます。 CPUバージョン:GPUをお持ちでない場合、またはGPUを使用したくない場合は、PytorchのCPUバージョンを選択できます。 2。PythonバージョンPytorch

MINIOオブジェクトストレージ:CENTOSシステムの下での高性能展開Minioは、Amazons3と互換性のあるGO言語に基づいて開発された高性能の分散オブジェクトストレージシステムです。 Java、Python、JavaScript、Goなど、さまざまなクライアント言語をサポートしています。この記事では、CentosシステムへのMinioのインストールと互換性を簡単に紹介します。 Centosバージョンの互換性Minioは、Centos7.9を含むがこれらに限定されない複数のCentosバージョンで検証されています。

Pytorchの分散トレーニングでは、Centosシステムでトレーニングには次の手順が必要です。Pytorchのインストール:PythonとPipがCentosシステムにインストールされていることです。 CUDAバージョンに応じて、Pytorchの公式Webサイトから適切なインストールコマンドを入手してください。 CPUのみのトレーニングには、次のコマンドを使用できます。PipinstalltorchtorchtorchvisionTorchaudioGPUサポートが必要な場合は、CUDAとCUDNNの対応するバージョンがインストールされ、インストールに対応するPytorchバージョンを使用してください。分散環境構成:分散トレーニングには、通常、複数のマシンまたは単一マシンの複数GPUが必要です。場所
