>백엔드 개발 >파이썬 튜토리얼 >Python 성능을 향상시키기 위한 지연 초기화

Python 성능을 향상시키기 위한 지연 초기화

巴扎黑
巴扎黑원래의
2017-03-30 14:37:511546검색

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

속성

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

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 클래스에는 반경, 면적, 둘레의 세 가지 속성이 있습니다. 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으로 문의하세요.