파이썬 에 len()
또는 값을 저장하는시기와 방법에 대한 규칙이 sum()
있습니까? 예를 들어, 클래스가있는 경우
class MyClass:
def __init__(self, single_number = 4, multiple_numbers = [1,2,3]):
self.single= single_number
self.multiple = multiple_numbers
def info(self):
print(f"The length of multiple is {len(self.multiple)}")
print(f"The length of multiple is {len(self.multiple)*4}")
print(f"The length of multiple is longer than {len(self.multiple)-1}")
if __name__ == "__main__":
test=MyClass()
test.info()
# other stuff
test.info()
어느 시점에서 len(self.multiple)
자신의 가치로 저장하기 시작 하시겠습니까? 고맙게도 파이썬은 len
같은 일부 작업 에 를 사용 for my_numbers in multiple_numbers:
하지 않으므로 반복에만 필요하지 않습니다. 또한의 값은 len
클래스 인스턴스에 대해 정적이며 런타임 내의 다른 부분에서 여러 번 필요하므로 여기와 같은 임시 변수가 아닙니다 . 일반적으로 이것은 (매우 적은 양의) 메모리와 계산 사이의 트레이드 오프로 보입니다. 동일한 문제가 sum()
.
이 질문의 일부는 의견 기반이며 이에 대해 어떻게 생각하는지 듣게되어 기쁩니다.하지만 저는 주로 이에 대한 관례를 찾고 있습니다.
len(self.multiple)
자신의 값으로 저장 해야 합니까?length_of_multiple_numbers
부풀어 보이지만 설명 적입니다.매번 계산 비용이 많이 들지 않는 한 스토리지를 정당화 할 것이 많다고 확신하지 않습니다. hpaulj의 답변을 참조하십시오.
그러나 정말로 원한다면 속성을 사용하고 캐시 할 수도 있습니다.
class MyList(list):
@property
def len_(self):
return len(self) #it's a list
or
_len_ = None
@property
def len_(self):
if self._len_ is None:
self._len_ = len(self)
return self._len_
def append(self, value):
self._len_ = None
super(MyList, self).append(value)
...and all other len-modifying methods also need to clear the cache.
다시 말하지만, 캐시하는 경우 결과가 변경 될 때마다 캐시를 재설정해야합니다. 이는 또한 인스턴스 변수에 저장하려는 아이디어의 약점입니다. 오래된 데이터가 없는지 확인하기위한 추가적인 복잡성은 이것이 실제로 성능 병목 현상이라고 프로파일 링 한 후에 만 허용되어야합니다.
(이 문제는 귀하의 예에서 btw에 대한 변경 가능한 기본 인수 를 사용하여 도움이되지 않습니다 multiple_numbers
). 일반적으로이를 확장하려면-합계 / 렌즈가 변경 가능한 항목의 상태에 의존하는 경우 계산을 저장 / 캐싱하는 것이 더 나쁜 생각입니다. 즉, MyList가 자체적으로 집계해야하는 len / sum이있는 객체를 참조하는 경우 MyList는 캐싱 / 저장에 관계없이 비즈니스가 없습니다.
명명 측면에서, 나는 아마도 내장 / 기존 이름을 섀도 잉하는 것을 피하기 위해 세미-컨벤션 명명을 할 것입니다 _
. 즉 : cls
-> cls_
, list
-> list_
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다