>백엔드 개발 >파이썬 튜토리얼 >지연 초기화 방법을 사용하여 Python 성능 향상

지연 초기화 방법을 사용하여 Python 성능 향상

高洛峰
高洛峰원래의
2017-03-24 16:52:301500검색

소위 클래스 속성의 지연 계산은 클래스의 속성을 속성으로 정의하는 것으로, 액세스할 때만 계산되며, 일단 액세스하면 결과는 별도의 조치 없이 캐시됩니다. 매번 하세요. 모두 계산되었습니다. 지연된 계산 속성을 구성하는 주요 목적은 성능
속성
을 향상시키는 것입니다. 본론으로 들어가기 전에 속성의 사용이 속성 액세스를 메서드 호출로 변환할 수 있다는 점을 이해해 보겠습니다.

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가 호출될 때마다 한 번씩 계산됩니다. 어떻게 한 번만 계산할 수 있습니까? 이것이 게으른 속성의 코드 구현입니다. 🎜>

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 클래스에는 반경, 면적, 둘레의 세 가지 속성이 있습니다. 면적과 둘레의 속성은 LazyProperty에 의해 장식됩니다. LazyProperty의 마법을 시험해 보겠습니다.

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

area()에서는 계산할 때마다 "계산 영역"이 한 번씩 인쇄됩니다. 연속해서 두 번 호출됩니다. "컴퓨팅 영역"은 c.area 다음에 한 번만 인쇄됩니다. 이는 LazyProperty로 인해 한 번 호출되면 이후에 몇 번 호출하더라도 다시 계산되지 않습니다.


위 내용은 지연 초기화 방법을 사용하여 Python 성능 향상의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.