>  기사  >  백엔드 개발  >  Python 객체 메모리 사용에 대한 간략한 토론

Python 객체 메모리 사용에 대한 간략한 토론

WBOY
WBOY원래의
2016-08-04 08:55:461437검색

모든 것은 객체이다

모든 유형의 상수와 변수, 정수, 부울, 심지어 함수까지 포함한 Python의 모든 것은 객체입니다. stackoverflow에 대한 질문을 참조하세요. Python에서는 모든 것이 Ruby와 같은 객체인가요?

코드에서 확인할 수 있습니다:

# 파이썬의 모든 것은 객체입니다 def fuction(): return print isinstance(True, object) print isinstance(0, object) print isinstance('a', object) print isinstance(fuction, object)

계산 방법

Python은 Python 객체의 크기를 계산하기 위해 sys 모듈에 getsizeof 함수를 제공합니다.

sys.getsizeof(object[, default])

以字节(byte)为单位返回对象大小。 这个对象可以是任何类型的对象。 所以内置对象都能返回正确的结果 但不保证对第三方扩展有效,因为和具体实现相关。

......

getsizeof() 调用对象的 __sizeof__ 方法, 如果对象由垃圾收集器管理, 则会加上额外的垃圾收集器开销。

물론, 객체 메모리 사용량은 Python 버전 및 운영체제 버전과 밀접한 관련이 있습니다. 본 글의 코드 및 테스트 결과는 windows7 32비트 운영체제를 기준으로 합니다.

sys 인쇄 sys.version 가져오기

<font color="#000000" face="NSimsun">2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 bit (Intel)]</font>

기본형

•부울

'True의 크기: %d' % (sys.getsizeof(True)) 인쇄 'False의 크기: %d' % (sys.getsizeof(False))

출력:

True 크기: 12 False 크기: 12

•정수

# 일반 정수 인쇄 '정수 크기: %d' % (sys.getsizeof(1)) # 긴 인쇄 '긴 정수 크기: %d' % (sys.getsizeof(1L)) 인쇄 '큰 크기 긴 정수: %d' % (sys.getsizeof(100000L)) 출력:

정수 크기: 12x 긴 정수 크기 1L: 14 긴 정수 크기 100000L: 16

정수형은 12바이트를 차지하고, 긴 정수형은 최소 14바이트를 점유하며, 자릿수가 증가할수록 차지하는 공간이 커지는 것을 알 수 있다. 버전 2.x에서는 정수형의 값이 sys.maxint를 초과하면 자동으로 긴 정수로 확장됩니다. Python 3.0 이후에는 정수와 긴 정수가 하나의 유형으로 통합됩니다.

•부동소수점

'float 크기: %d' % (sys.getsizeof(1.0)) 인쇄

출력:

플로트 크기: 16

부동소수점 형식은 16바이트를 차지합니다. 특정 정밀도를 초과하면 반올림됩니다.

다음 코드를 참고하세요:

인쇄 1.00000000003 인쇄 1.000000000005

출력:

1.00000000003 1.00000000001

•문자열

# 문자열 유형의 크기 print 'rn'.join(["%d 문자가 있는 문자열의 크기: %d" % (len(elem), sys.getsizeof(elem)) for elem in ["", " a", "ab"]]) # 유니코드 문자열의 크기 print 'rn'.join(["%d 문자가 있는 유니코드 문자열의 크기: %d" % (len(elem), sys.getsizeof(elem)) for [u"", u"a", u"ab"]])의 요소

출력:

문자가 0개인 문자열 크기: 21 문자가 1개인 문자열 크기: 22 문자가 2개인 문자열 크기: 23 문자가 0개인 유니코드 문자열 크기: 26 문자가 1개인 유니코드 문자열 크기: 28 문자가 있는 유니코드 문자열 크기 2자: 30

일반적인 빈 문자열은 21바이트를 차지하고 각 추가 문자는 1바이트를 더 차지합니다. 유니코드 문자열은 최소 26바이트를 차지하며 각 추가 문자는 추가로 2바이트를 차지합니다.

컬렉션 유형

•목록

# 목록 유형의 크기 print 'rn'.join(["%d 요소가 있는 목록의 크기: %d" % (len(elem), sys.getsizeof(elem)) for elem in [[], [ 0], [0,2], [0,1,2]]])

출력:

요소가 0개인 목록 크기: 36 요소가 1개인 목록 크기: 40 요소가 2개인 목록 크기: 44 요소가 3개인 목록 크기: 48

표시되는 목록은 최소 36바이트를 차지하며 각 추가 요소는 4바이트씩 증가합니다. 그러나 sys.getsizeof 함수는 컨테이너 유형의 요소 크기를 계산하지 않는다는 점에 유의하십시오. 예:

'3개의 정수가 있는 목록의 크기 %d' % (sys.getsizeof([0,1,2])) 인쇄 '3개의 문자열이 있는 목록의 크기 %d' % (sys.getsizeof(['0') ,'1','2']))

출력:

3개의 정수가 포함된 목록 크기 48 3개의 문자열이 포함된 목록 크기 48

컨테이너에 저장되는 내용은 요소에 대한 참조여야 합니다. 컨테이너의 정확한 계산을 원할 경우 레시피의 재귀적 크기를 참조할 수 있습니다. 제공되는 total_size 함수를 사용하세요.

'3개의 정수가 있는 목록의 전체 크기 %d'를 인쇄합니다. % (total_size([0,1,2])) '3개의 문자열이 있는 목록의 전체 크기가 %d'입니다. % (total_size(['0',' 1','2']))

출력은 다음과 같습니다.

3개의 정수가 있는 목록의 전체 크기 84 3개의 문자열이 있는 목록의 전체 크기 114

목록이 차지하는 공간은 기본 공간 36(객체 참조 4 객체 크기) * 요소 수임을 알 수 있습니다.

또한 목록 변수를 선언하면 요소를 추가할 때 효율성을 높이기 위해 일부 공간이 미리 할당됩니다.

li = [] for i in range(0, 101): '%d 정수 크기의 목록 인쇄: %d, total_size: %d' % (i, getsizeof(li), total_size(li)) li. 추가(i)

•튜플

기본적으로 목록과 유사하지만 최소 28바이트를 차지합니다.

•사전

사전의 상황은 상대적으로 복잡합니다. 물론 자세한 내용은 dictobject.c 코드를 참조해야 합니다. 또한 사전 최적화에 대한 참고 사항도 주의 깊게 읽어 볼 가치가 있습니다.

기본적인 상황의 경우 사전에 대한 Python의 기본 해시 데이터 구조에 대한 [stackoverflow] 질문에서 몇 가지 답변을 참조할 수 있습니다.

•사전의 최소 공간은 8개 항목(PyDict_MINSIZE)입니다.
•응모 횟수가 50,000회 미만일 때마다 4배로 늘어납니다.
•참여 수가 50,000개를 초과할 때마다 2배씩 증가합니다.
• 키의 해시 값은 사전에 캐시되며 사전 크기가 조정된 후에는 다시 계산되지 않습니다.

사전은 2/3에 가까워질 때마다 크기가 조정됩니다.

파이썬 개체의 메모리 사용량을 간략하게 설명한 위 글은 모두 편집자가 공유한 내용이므로 참고가 되셨으면 좋겠습니다. Script Home을 지원해 주시길 바랍니다.

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