Heim  >  Artikel  >  Backend-Entwicklung  >  Verwenden Sie die verzögerte Initialisierungsmethode, um die Python-Leistung zu verbessern

Verwenden Sie die verzögerte Initialisierungsmethode, um die Python-Leistung zu verbessern

高洛峰
高洛峰Original
2017-03-24 16:52:301403Durchsuche

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, dass es einmal berechnet wird. Es ist eine Verschwendung von CPU. Wie kann es nur einmal berechnet werden? >
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“ einmal bei jeder Berechnung gedruckt und fortlaufend aufgerufen. „Computing Area“ wird nur einmal nach „c.area“ zweimal gedruckt. Dies liegt an LazyProperty. Solange es einmal aufgerufen wird, wird es nicht erneut gezählt, unabhängig davon, wie viele nachfolgende Aufrufe getätigt werden.

>>> c = Circle(2)
>>> print c.area
Computing area
12.5663706144
>>> print c.area
12.5663706144


-->

Das obige ist der detaillierte Inhalt vonVerwenden Sie die verzögerte Initialisierungsmethode, um die Python-Leistung zu verbessern. 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