>  기사  >  백엔드 개발  >  성능 향상을 위해 Python 지연 초기화를 사용하는 예에 대한 자세한 설명

성능 향상을 위해 Python 지연 초기화를 사용하는 예에 대한 자세한 설명

Y2J
Y2J원래의
2017-04-17 18:01:361309검색

소위 클래스 속성의 지연 계산은 클래스의 속성을 속성으로 정의하는 것으로, 액세스할 때만 계산되며, 일단 액세스하면 결과는 별도의 조치 없이 캐시됩니다. 매번 하세요. 모두 계산되었습니다. 지연된 계산 속성을 구성하는 주요 목적은 성능

속성

을 향상시키는 것입니다. 본론으로 들어가기 전에 속성의 사용이 속성 액세스를 메서드 호출로 변환할 수 있다는 점을 이해해 보겠습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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