Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung von Beispielen für die Verwendung der verzögerten Python-Initialisierung zur Verbesserung der Leistung

Ausführliche Erläuterung von Beispielen für die Verwendung der verzögerten Python-Initialisierung zur Verbesserung der Leistung

Y2J
Y2JOriginal
2017-04-17 18:01:361348Durchsuche

Die sogenannte verzögerte Berechnung von Klassenattributen besteht darin, die Attribute der Klasse als Eigenschaft zu definieren, die nur bei Zugriff berechnet wird. Sobald darauf zugegriffen wird, wird das Ergebnis zwischengespeichert, ohne dass dies erforderlich ist Mach es jedes Mal. Alles berechnet. Der Hauptzweck der Erstellung einer Eigenschaft für verzögerte Berechnungen besteht darin, die Leistung zu verbessern.

Wie Sie sehen können, kann c.area nach dem Hinzufügen von @property direkt ausgeführt und als Eigenschaft aufgerufen werden, obwohl der Bereich als Methode definiert ist.

Jetzt kommt das Problem, wenn c.area einmal aufgerufen wird. Es ist eine Verschwendung von CPU. Das ist die Code-Implementierung der Lazy-Eigenschaft 🎜>
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

Beschreibung

definiert eine Lazy-Calculation-Decorator-Klasse LazyProperty. Circle ist eine zum Testen verwendete Klasse. Die Circle-Klasse verfügt über drei Attribute: Radius, Fläche und Umfang. Die Eigenschaften von Fläche und Umfang werden von LazyProperty dekoriert. Probieren wir die Magie von LazyProperty aus:

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

In area() wird „Rechenfläche“ bei jeder Berechnung einmal gedruckt und c aufgerufen zweimal hintereinander wird „Computing Area“ nur einmal nach .area gedruckt. Dies liegt an LazyProperty. Solange es einmal aufgerufen wird, wird es nicht erneut gezählt, unabhängig davon, wie viele nachfolgende Aufrufe erfolgen.

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen für die Verwendung der verzögerten Python-Initialisierung zur Verbesserung der Leistung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn