소위 클래스 속성의 지연 계산은 클래스의 속성을 속성으로 정의하는 것으로, 액세스할 때만 계산되며, 일단 액세스하면 결과는 별도의 조치 없이 캐시됩니다. 매번 하세요. 모두 계산되었습니다. 지연된 계산 속성을 구성하는 주요 목적은 성능
을 향상시키는 것입니다. 본론으로 들어가기 전에 속성의 사용이 속성 액세스를 메서드 호출로 변환할 수 있다는 점을 이해해 보겠습니다.
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 클래스에는 반경, 면적, 둘레의 세 가지 속성이 있습니다. Area와 perimeter의 속성은 LazyProperty로 장식됩니다. LazyProperty의 마법을 시험해 보겠습니다.
>>> c = Circle(2) >>> print c.area Computing area 12.5663706144 >>> print c.area 12.5663706144
Area()에서 계산할 때마다 "계산 영역"이 인쇄되고 c.area는 두 번 호출됩니다. 마지막 "컴퓨팅 영역"은 한 번만 인쇄됩니다. 이는 LazyProperty로 인해 한 번 호출되는 한 이후 호출 횟수에 관계없이 다시 계산되지 않습니다.
위 내용은 성능 향상을 위해 Python 지연 초기화를 사용하는 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!