Python のパフォーマンスを向上させるための遅延初期化

巴扎黑
リリース: 2017-03-30 14:37:51
オリジナル
1522 人が閲覧しました

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

プロパティ

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

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 が呼び出されるたびに 1 回だけ計算されます。どうすれば 1 回だけ計算できるのでしょうか。これが遅延プロパティです


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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート