ホームページ  >  記事  >  バックエンド開発  >  Python の遅延初期化を使用してパフォーマンスを向上させる例の詳細な説明

Python の遅延初期化を使用してパフォーマンスを向上させる例の詳細な説明

Y2J
Y2Jオリジナル
2017-04-17 18:01:361347ブラウズ

いわゆるクラス属性の遅延計算とは、クラスの属性をプロパティとして定義し、アクセスされたときのみ計算され、アクセスされると結果がキャッシュされるので計算する必要がありません。毎回。遅延計算プロパティを構築する主な目的は、パフォーマンスを向上させることです

プロパティ

本題に入る前に、プロパティの使用法を理解して、プロパティへのアクセスをメソッド呼び出しに変換します。

class Circle(object): 
  def init(self, radius): 
    self.radius = radius 
  
  @property
  def area(self): 
    return 3.14 * self.radius ** 2
  
c = Circle(4) 
print c.radius 
print c.area

area はメソッドとして定義されていますが、 @property を追加すると、c.area が直接実行され、プロパティとしてアクセスできることがわかります。

ここで、c.area が呼び出されるたびに計算されますが、これは CPU の無駄です。これは、遅延プロパティ

コードの実装です

説明

遅延計算 Decorator クラス LazyProperty を定義します。 Circle はテストに使用されるクラスです。Circle クラスには、半径、面積、周長の 3 つの属性があります。面積と周囲のプロパティは LazyProperty によって装飾されます。LazyProperty の魔法を試してみましょう:

class LazyProperty(object):
  def init(self, func):
    self.func = func
  def get(self, instance, owner):
    if instance is None:
      return self
    else:
      value = self.func(instance)
      setattr(instance, self.func.name, value)
      return value
import math
class Circle(object):
  def init(self, radius):
    self.radius = radius
  @LazyProperty
  def area(self):
    print 'Computing area'
    return math.pi * self.radius ** 2
  @LazyProperty
  def perimeter(self):
    print 'Computing perimeter'
    return 2 * math.pi * self.radius

「面積の計算」は area() で計算されるたびに出力され、c.area を 2 回連続して呼び出した後、「計算領域「を印刷します。」は 1 回だけ印刷されました。これは LazyProperty によるもので、一度呼び出される限り、その後何回呼び出してもカウントされません。

以上がPython の遅延初期化を使用してパフォーマンスを向上させる例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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