遅延初期化メソッドを使用して Python のパフォーマンスを向上させる

高洛峰
リリース: 2017-03-24 16:52:30
オリジナル
1408 人が閲覧しました

いわゆるクラス属性の遅延計算とは、クラスの属性をプロパティとして定義し、アクセスされたときのみ計算され、アクセスされると結果がキャッシュされるので計算する必要がありません。毎回。遅延計算プロパティを構築する主な目的は、パフォーマンスを向上させることです
プロパティ
本題に入る前に、プロパティの使用法を理解して、プロパティへのアクセスをメソッド呼び出しに変換します。

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 の無駄です。これは遅延プロパティです

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
ログイン後にコピー
説明

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

>>> c = Circle(2)
>>> print c.area
Computing area
12.5663706144
>>> print c.area
12.5663706144
ログイン後にコピー

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


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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!