目次
2. @jit
3. @do_twice
4. @count_calls
5. @dataclass
6. @singleton
7. @use_unit
8. @singledispatch
ホームページ バックエンド開発 Python チュートリアル 素晴らしい! 8 つのクールな Python デコレータをおすすめします。

素晴らしい! 8 つのクールな Python デコレータをおすすめします。

Apr 19, 2023 am 11:49 AM
python デコレータ

素晴らしい! 8 つのクールな Python デコレータをおすすめします。

まえがき

Python プログラミング言語の優れた点の 1 つは、非常に便利なすべての機能が小さなパッケージに詰め込まれていることです。

多くの機能により Python コードの機能が完全に変更され、言語がさらに柔軟になります。これらの機能の一部を正しく使用すると、プログラムの作成に必要な時間を効果的に短縮できます。

これらの目標を達成する良い例は、Python のデコレータです。

デコレータ

デコレータは、Python 関数オブジェクトの動作を変更するために使用できる関数です。これらはクラスや関数に適用でき、本当に興味深いことがたくさんできます。

デコレータを使用すると、コードを短縮し、速度を上げ、Python でのコードの動作を完全に変えることができます。

言うまでもなく、これは確かに便利です。今日は、チェックする価値があると思うデコレーターをいくつか紹介したいと思います。

デコレータはたくさんありますが、最も優れた機能を備えていると思われるものをいくつか選びました。

1. @lru_cache

このリストの最初のデコレータは functools モジュールからのものです。

このモジュールは標準ライブラリに含まれており、非常に使いやすいです。このデコレータよりも優れた機能も含まれていますが、このデコレータは間違いなく私のお気に入りです。

このデコレータを使用すると、キャッシュを使用して関数の連続実行を高速化できます。もちろん、これはキャッシュに関するいくつかの注意点を念頭に置いて使用する必要がありますが、一般的なユースケースでは、ほとんどの場合、このデコレータを使用する価値があります。

単純なデコレータを使用してコードを高速化できるのは素晴らしいことです。

このようなデコレータから恩恵を受ける可能性のある関数の良い例は、階乗を計算する関数などの再帰関数です。

def factorial(n):
 return n * factorial(n-1) if n else 1
ログイン後にコピー

再帰は、次の点で非常に困難になる可能性があります。計算時間は長くなりますが、このデコレータを追加すると、この関数の連続実行を大幅に高速化できます。

@lru_cache
def factorial(n):
 return n * factorial(n-1) if n else 1
ログイン後にコピー

これで、この関数を実行するたびに、最初のいくつかの階乗計算がキャッシュに保存されます。

したがって、次回この関数を呼び出すときは、前に使用した階乗の後の階乗を計算するだけで済みます。

もちろん、すべての階乗計算が保存されるわけではありませんが、このデコレータが、自然に遅いコードを高速化するのに適したアプリケーションである理由は簡単にわかります。

2. @jit

JIT は Just In Time の略です。通常、Python でコードを実行すると、最初にコンパイルが行われます。

型にはメモリが割り当てられ、未割り当ての名前付きエイリアスとして保存されるため、このコンパイルではある程度のオーバーヘッドが発生します。ジャストインタイム コンパイルでは、実行時のみコンパイルします。

これは、多くの点で、Python インタープリターが時間を節約するために 2 つの処理を同時に処理する並列コンピューティングに似たものと考えることができます。

Numba JIT コンパイラーは、この概念を Python に導入したことで有名です。 @lru_cache と同様に、このデコレーターは非常に簡単に呼び出すことができ、コードのパフォーマンスを即座に向上させます。 Numba パッケージは、C を使用せずに、より負荷の高いソフトウェアを簡単に実行できるようにする jit デコレーターを提供します。

次のケースでは、@jit デコレータを使用してモンテカルロ法の計算を高速化します。

from numba import jit
import random
@jit(nopython=True)
def monte_carlo_pi(nsamples):
 acc = 0
 for i in range(nsamples):
 x = random.random()
 y = random.random()
 if (x ** 2 + y ** 2) < 1.0:
 acc += 1
 return 4.0 * acc / nsamples
ログイン後にコピー

3. @do_twice

do_twice デコレーターの機能はその名前と似ています。このデコレータを使用すると、1 回の呼び出しで関数を 2 回実行できます。これには確かにいくつかの用途があり、特にデバッグに便利だと思います。

これは、2 つの異なる反復のパフォーマンスを測定するために使用できます。 Functools を例に挙げると、関数を 2 回実行して改善を確認できます。この関数は、標準ライブラリにある Python のデコレーター モジュールによって提供されます。

from decorators import do_twice
@do_twice
def timerfunc():
%timeit factorial(15)
ログイン後にコピー

4. @count_calls

count_calls デコレータを使用すると、ソフトウェア内で関数が使用された回数に関する情報を提供できます。

do_twice と同様、これはデバッグ時に確かに役立ちます。

特定の関数に追加すると、関数が実行されるたびに、その関数が何回実行されたかを示す出力を受け取ります。このデコレータは、標準ライブラリのデコレータ モジュールにも含まれています。

from decorators import count_calls
@count_calls
def function_example():
print("Hello World!")
function_example()
function_example()
function_example()
ログイン後にコピー

5. @dataclass

クラスの作成時間を節約するために、私が常に使用してきた最高のデコレータの 1 つは @dataclass デコレータです。

このデコレータを使用すると、通常、作成するクラスに含まれる共通の標準メソッドをクラス内ですばやく作成できます。

このデコレータはデータクラス モジュールから取得されます。このモジュールは標準ライブラリにも含まれているため、この例を試すのに PIP は必要ありません。

from dataclasses import dataclass
@dataclass
class Food:
name: str
unit_price: float
stock: int = 0
 def stock_value(self) -> float:
 return(self.stock * self.unit_price)
ログイン後にコピー

このコードは、クラスにデータを設定するために必要な位置パラメータを持つ初期化関数 init() を自動的に作成します。

これらは self にも自動的に提供されるため、クラスにデータ パラメーターを入れるための長い関数を作成する必要はありません。

6. @singleton

シングルトン デコレータの目的を理解するには、まずシングルトン (シングルトン) とは何かを理解する必要があります。ある意味、シングルトンはグローバル変数型のバージョンです。

这意味着类型被定义为只存在一次。尽管这些在 C++ 等语言中很常见,但在 Python 中却很少见到。使用单例,我们可以创建一个只使用一次的类并改变类,而不是通过初始化来构造新的类型。

通常,单例装饰器是由用户自己编写的,实际上并不是导入的。

这是因为单例仍然是对我们单例装饰器中提供的模板的引用。我们可以命名一个单例函数并编写一个包装器,以便在我们的类上使用这个装饰器:

def singleton(cls):
instances = {}
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton
class cls:
def func(self):
ログイン後にコピー

另一种方法是使用元类!

7. @use_unit

在科学计算中经常派上用场的一种装饰器是 @use_unit 装饰器。

此装饰器可用于更改返回结果的表示单位。这对于那些不想在数据中添加度量单位但仍希望人们知道这些单位是什么的人很有用。

这个装饰器也不是在任何模块中真正可用,但它是非常常见的,对科学应用程序非常有用。

def use_unit(unit):
"""Have a function return a Quantity with given unit"""
use_unit.ureg = pint.UnitRegistry()
def decorator_use_unit(func):
@functools.wraps(func)
def wrapper_use_unit(*args, **kwargs):
value = func(*args, *_kwargs)
return value _ use_unit.ureg(unit)
return wrapper_use_unit
return decorator_use_unit
@use_unit("meters per second")
def average_speed(distance, duration):
return distance / duration
ログイン後にコピー

8. @singledispatch

Functools 凭借非常有用的@singledispatch 装饰器再次在此列表中脱颖而出。

单调度是一种编程技术,在许多编程语言中都很常见,因为它是一种非常棒的编程方式。虽然我更喜欢多调度,但我认为单调度可以在很多方面扮演相同的角色。

这个装饰器使得在 Python 中使用多类型数据变得更加容易, 尤其当我们希望通过同一方法传递多种类型数据时,情况更是如此。

@singledispatch
def fun(arg, verbose=False):
if verbose:
print("Let me just say,", end=" ")
print(arg)
@fun.register
def _(arg: int, verbose=False):
if verbose:
print("Strength in numbers, eh?", end=" ")
print(arg)
@fun.register
def _(arg: list, verbose=False):
if verbose:
print("Enumerate this:")
for i, elem in enumerate(arg):
print(i, elem)
ログイン後にコピー

以上が素晴らしい! 8 つのクールな Python デコレータをおすすめします。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPythonの選択:ガイド PHPとPythonの選択:ガイド Apr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

Visual StudioコードはPythonで使用できますか Visual StudioコードはPythonで使用できますか Apr 15, 2025 pm 08:18 PM

VSコードはPythonの書き込みに使用でき、Pythonアプリケーションを開発するための理想的なツールになる多くの機能を提供できます。ユーザーは以下を可能にします。Python拡張機能をインストールして、コードの完了、構文の強調表示、デバッグなどの関数を取得できます。デバッガーを使用して、コードを段階的に追跡し、エラーを見つけて修正します。バージョンコントロールのためにGitを統合します。コードフォーマットツールを使用して、コードの一貫性を維持します。糸くずツールを使用して、事前に潜在的な問題を発見します。

Windows 8でコードを実行できます Windows 8でコードを実行できます Apr 15, 2025 pm 07:24 PM

VSコードはWindows 8で実行できますが、エクスペリエンスは大きくない場合があります。まず、システムが最新のパッチに更新されていることを確認してから、システムアーキテクチャに一致するVSコードインストールパッケージをダウンロードして、プロンプトとしてインストールします。インストール後、一部の拡張機能はWindows 8と互換性があり、代替拡張機能を探すか、仮想マシンで新しいWindowsシステムを使用する必要があることに注意してください。必要な拡張機能をインストールして、適切に動作するかどうかを確認します。 Windows 8ではVSコードは実行可能ですが、開発エクスペリエンスとセキュリティを向上させるために、新しいWindowsシステムにアップグレードすることをお勧めします。

VSCODE拡張機能は悪意がありますか? VSCODE拡張機能は悪意がありますか? Apr 15, 2025 pm 07:57 PM

VSコード拡張機能は、悪意のあるコードの隠れ、脆弱性の活用、合法的な拡張機能としての自慰行為など、悪意のあるリスクを引き起こします。悪意のある拡張機能を識別する方法には、パブリッシャーのチェック、コメントの読み取り、コードのチェック、およびインストールに注意してください。セキュリティ対策には、セキュリティ認識、良好な習慣、定期的な更新、ウイルス対策ソフトウェアも含まれます。

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PHPとPython:彼らの歴史を深く掘り下げます PHPとPython:彼らの歴史を深く掘り下げます Apr 18, 2025 am 12:25 AM

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

ターミナルVSCODEでプログラムを実行する方法 ターミナルVSCODEでプログラムを実行する方法 Apr 15, 2025 pm 06:42 PM

VSコードでは、次の手順を通じて端末でプログラムを実行できます。コードを準備し、統合端子を開き、コードディレクトリが端末作業ディレクトリと一致していることを確認します。プログラミング言語(pythonのpython your_file_name.pyなど)に従って実行コマンドを選択して、それが正常に実行されるかどうかを確認し、エラーを解決します。デバッガーを使用して、デバッグ効率を向上させます。

See all articles