문제

32 및 64 비트 플랫폼에서 Python Data Stucture의 메모리 크기에 대한 참조가 있습니까?

그렇지 않다면, 이것은 그렇게하는 것이 좋을 것입니다. 더 철저할수록 좋습니다! 따라서 다음 파이썬 구조에 의해 얼마나 많은 바이트가 사용됩니까 ( len 그리고 관련된 경우 컨텐츠 유형)?

  • int
  • float
  • 참조
  • str
  • 유니 코드 문자열
  • tuple
  • list
  • dict
  • set
  • array.array
  • numpy.array
  • deque
  • 새로운 스타일 클래스 개체
  • 구식 클래스 개체
  • ... 그리고 내가 잊고있는 모든 것!

(다른 개체에 대한 언급 만 유지하는 컨테이너의 경우, 우리는 분명히 공유 될 수 있기 때문에 항목의 크기를 자체적으로 계산하고 싶지 않습니다.)

또한 런타임 (재귀 적이든 아니든)에서 객체에서 메모리를 사용하는 방법이 있습니까?

도움이 되었습니까?

해결책

추천 이전 질문 여기에는 사용이 필요했습니다 sys.getsizeof (), 인용 :

>>> import sys
>>> x = 2
>>> sys.getsizeof(x)
14
>>> sys.getsizeof(sys.getsizeof)
32
>>> sys.getsizeof('this')
38
>>> sys.getsizeof('this also')
48

이 접근법을 취할 수 있습니다.

>>> import sys
>>> import decimal
>>> 
>>> d = {
...     "int": 0,
...     "float": 0.0,
...     "dict": dict(),
...     "set": set(),
...     "tuple": tuple(),
...     "list": list(),
...     "str": "a",
...     "unicode": u"a",
...     "decimal": decimal.Decimal(0),
...     "object": object(),
... }
>>> for k, v in sorted(d.iteritems()):
...     print k, sys.getsizeof(v)
...
decimal 40
dict 140
float 16
int 12
list 36
object 8
set 116
str 25
tuple 28
unicode 28

2012-09-30

Python 2.7 (Linux, 32 비트) :

decimal 36
dict 136
float 16
int 12
list 32
object 8
set 112
str 22
tuple 24
unicode 32

파이썬 3.3 (Linux, 32 비트)

decimal 52
dict 144
float 16
int 14
list 32
object 8
set 112
str 26
tuple 24
unicode 26

2016-08-01

OSX, Python 2.7.10 (기본값, 2015 년 10 월 23 일, 19:19:21) [GCC 4.2.1 호환 Apple LLVM 7.0.0 (Clang-700.0.59.5)]

decimal 80
dict 280
float 24
int 24
list 72
object 16
set 232
str 38
tuple 56
unicode 52

다른 팁

나는 행복하게 사용해 왔습니다 피파러 그러한 작업을 위해. 많은 버전의 파이썬과 호환됩니다. asizeof 특히 모듈은 2.2로 돌아갑니다!

예를 들어 Hughdbrown의 예를 사용하지만 다음과 같습니다 from pympler import asizeof 처음에 print asizeof.asizeof(v) 결국, 나는 (MacOSX 10.5의 System Python 2.5)를 본다 :

$ python pymp.py 
set 120
unicode 32
tuple 32
int 16
decimal 152
float 16
list 40
object 0
dict 144
str 32

분명히 여기에는 근사치가 있지만 발자국 분석 및 튜닝에 매우 유용하다는 것을 알았습니다.

이 답변은 모두 얕은 크기 정보를 수집합니다. 나는이 질문에 대한 방문객들이 여기서 "이 복잡한 대상이 얼마나 큰가?"라는 질문에 대답 할 것이라고 생각합니다.

여기에는 큰 대답이 있습니다. https://goshippo.com/blog/measure--real-size-any-python-object/

펀치 라인 :

import sys

def get_size(obj, seen=None):
    """Recursively finds size of objects"""
    size = sys.getsizeof(obj)
    if seen is None:
        seen = set()
    obj_id = id(obj)
    if obj_id in seen:
        return 0
    # Important mark as seen *before* entering recursion to gracefully handle
    # self-referential objects
    seen.add(obj_id)
    if isinstance(obj, dict):
        size += sum([get_size(v, seen) for v in obj.values()])
        size += sum([get_size(k, seen) for k in obj.keys()])
    elif hasattr(obj, '__dict__'):
        size += get_size(obj.__dict__, seen)
    elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
        size += sum([get_size(i, seen) for i in obj])
    return size

그렇게 사용 :

In [1]: get_size(1)
Out[1]: 24

In [2]: get_size([1])
Out[2]: 104

In [3]: get_size([[1]])
Out[3]: 184

Python의 메모리 모델을 더 깊이 알고 싶다면 여기에 더 긴 설명의 일부로 비슷한 "총 크기"코드 스 니펫이있는 훌륭한 기사가 있습니다. https://code.tutsplus.com/tutorials/understand-how-much-memory-your-python-objects-use--cms-25609

메모리 프로파일 러를 사용해보십시오.메모리 프로파일 러

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

또한 사용할 수 있습니다 구피 기준 치수.

>>> from guppy import hpy; hp=hpy()
>>> hp.heap()
Partition of a set of 25853 objects. Total size = 3320992 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0  11731  45   929072  28    929072  28 str
     1   5832  23   469760  14   1398832  42 tuple
     2    324   1   277728   8   1676560  50 dict (no owner)
     3     70   0   216976   7   1893536  57 dict of module
     4    199   1   210856   6   2104392  63 dict of type
     5   1627   6   208256   6   2312648  70 types.CodeType
     6   1592   6   191040   6   2503688  75 function
     7    199   1   177008   5   2680696  81 type
     8    124   0   135328   4   2816024  85 dict of class
     9   1045   4    83600   3   2899624  87 __builtin__.wrapper_descriptor
<90 more rows. Type e.g. '_.more' to view.>

그리고:

>>> hp.iso(1, [1], "1", (1,), {1:1}, None)
Partition of a set of 6 objects. Total size = 560 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0      1  17      280  50       280  50 dict (no owner)
     1      1  17      136  24       416  74 list
     2      1  17       64  11       480  86 tuple
     3      1  17       40   7       520  93 str
     4      1  17       24   4       544  97 int
     5      1  17       16   3       560 100 types.NoneType

DIR ([Object]) 내장 함수를 사용하면 크기 내장 기능.

>>> a = -1
>>> a.__sizeof__()
24
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top