سؤال

هل هناك مرجع لحجم ذاكرة Python Datture Ducture على منصات 32 و 64 بت؟

إذا لم يكن الأمر كذلك، فسيكون هذا لطيفا أن يكون ذلك كذلك. كلما كان ذلك أكثر شمولة أفضل! إذن كم عدد البايتات التي تستخدمها هياكل الثعبان التالية (اعتمادا على len ونوع المحتوى عند الصلة)؟

  • int
  • float
  • المرجعي
  • str
  • Unicode سلسلة
  • 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

بيثون 2.7 (لينكس، 32 بت):

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

بيثون 3.3 (لينكس، 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، بيثون 2.7.10 (افتراضي، 23 أكتوبر 2015، 19:19:21) [GCC 4.2.1 متوافق Apple LLVM 7.0.0 (Clang-700.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!

على سبيل المثال، باستخدام مثال HHAGHDBROWN ولكن مع from pympler import asizeof في البداية و print asizeof.asizeof(v) في النهاية، أرى (System Python 2.5 على Macosx 10.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

إذا كنت ترغب في معرفة نموذج الذاكرة في بيثون بعمق، فهناك مقالة رائعة هنا تحتوي على مقتطف مشابه "الحجم الكلي" كجزء من شرح أطول: https://code.tutsplus.com/Tutorials/understand-how-much-memory-your-phenthon-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

كما يمكنك استخدام guppy. وحدة.

>>> 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 ([كائن]) وظيفة مدمجة، يمكنك حجم وظيفة مدمجة.

>>> a = -1
>>> a.__sizeof__()
24
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top