>  기사  >  백엔드 개발  >  Python 객체 메모리 사용량

Python 객체 메모리 사용량

高洛峰
高洛峰원래의
2017-02-28 16:48:531820검색

모든 것이 객체입니다

모든 유형의 상수와 변수, 정수, 부울, 함수까지 포함하여 Python의 모든 것이 객체입니다. Stackoverflow에 대한 질문을 참조하세요 Is everything an object in Python like ruby

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

# everything in python is object def fuction(): return print isinstance(True, object ) print isinstance(0, object) print isinstance('a', object) print isinstance(fuction, object)

계산 방법

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

sys.getsizeof(object[, default])

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

......

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

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

import sys print sys.version

2.7.2(기본값, 2011년 6월 24일, 12:21:10) [MSC v.1500 32비트(Intel)]

기본 유형

•부울 유형

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

출력:

True의 크기: 12 False의 크기: 12

•Integer

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

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

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

•Float 유형

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

출력:

float 크기 인쇄 : 16

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

다음 코드 참조:

print 1.00000000003 print 1.000000000005

출력:

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 elem in [u"", u"a", u"ab"]])

출력:

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

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

컬렉션 유형

•List

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

출력:

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

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

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

출력:

3개의 정수가 있는 목록 크기 48 3개의 문자열이 있는 목록 크기 48

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

print '3개의 정수가 있는 목록의 전체 크기 %d' % (total_size([0,1,2])) print '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.append(i)

•Tuple

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

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

•사전의 최소 공간은 8개 항목(PyDict_MINSIZE)입니다.
•항목 수가 50,000개 미만인 경우 매번 4배씩 증가합니다.
•항목 수가 더 많은 경우 50,000보다 크면 매번 2배씩 증가합니다.
•키의 해시 값은 사전에 캐시되며 사전 크기가 조정된 후에는 다시 계산되지 않습니다.

사전은 매번 크기가 조정됩니다. 2/3에 가까워요.

위 Python 개체 메모리 사용에 관한 기사는 모두 편집자가 공유한 내용이므로 참고가 되기를 바라며 PHP 중국어 웹사이트를 지원해 주시길 바랍니다.

Python 객체 메모리 사용과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

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