Verzögerte Initialisierung zur Verbesserung der Python-Leistung

巴扎黑
Freigeben: 2017-03-30 14:37:51
Original
1514 Leute haben es durchsucht

Die sogenannte verzögerte Berechnung von Klassenattributen besteht darin, die Attribute der Klasse als Eigenschaft zu definieren, die nur beim Zugriff berechnet wird, und nach dem Zugriff wird das Ergebnis ohne Notwendigkeit zwischengespeichert Mach es jedes Mal. Alles berechnet. Der Hauptzweck des Aufbaus einer verzögerten Berechnungseigenschaft besteht darin, die Leistung zu verbessern von Eigenschaften in einen Methodenaufruf.




Wie Sie sehen können, kann c.area nach dem Hinzufügen von @property direkt als Property-Zugriff ausgeführt 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
Nach dem Login kopieren







Beschreibung

definiert eine verzögert berechnete Dekoratorklasse 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
Nach dem Login kopieren




In area() wird jedes Mal „Computing“ gedruckt wird berechnet. Fläche“, während „Rechenfläche“ nur einmal nach zweimaligem Aufruf von c.area ausgegeben wurde. 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
Nach dem Login kopieren


-->

Das obige ist der detaillierte Inhalt vonVerzögerte Initialisierung zur Verbesserung der Python-Leistung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage