سؤال

على سبيل المثال, هو مقدار الذاكرة المطلوبة لتخزين قائمة مليون (32-بت) الاعداد الصحيحه ؟

alist = range(1000000) # or list(range(1000000)) in Python 3.0
هل كانت مفيدة؟

المحلول 2

روابط مفيدة:

كيفية الحصول على حجم الذاكرة/استخدام بيثون كائن

أحجام الذاكرة من بيثون الكائنات ؟

إذا وضعت البيانات في القاموس ، كيف يتم حساب حجم البيانات?

إلا أنها لا تعطي إجابة شافية.الطريق للذهاب:

  1. قياس الذاكرة المستهلكة من قبل مترجم بايثون مع/بدون قائمة (استخدام أدوات نظام التشغيل).

  2. استخدام طرف ثالث امتداد الوحدة التي تعرف نوعا من sizeof(PyObject).

التحديث:

وصفة 546530:حجم الثعبان الكائنات (المنقحة)

import asizeof

N = 1000000
print asizeof.asizeof(range(N)) / N
# -> 20 (python 2.5, WinXP, 32-bit Linux)
# -> 33 (64-bit Linux)

نصائح أخرى

"ذلك يعتمد". بيثون يخصص مساحة القوائم في مثل هذه الطريقة لتحقيق تستهلك وقت ثابت من أجل إضافة عناصر إلى القائمة.

في الممارسة العملية ، ماذا يعني هذا مع تنفيذ...قائمة دائما المساحة المخصصة السلطة من يومين عدد من العناصر.لذلك مجموعة(1000000) الواقع على تخصيص قائمة كبيرة بما يكفي لعقد 2^20 عناصر (~ 1.045 مليون دولار).

هذا هو فقط المساحة المطلوبة لتخزين قائمة الهيكل نفسه (وهو مجموعة من المؤشرات إلى الثعبان الكائنات لكل عنصر).نظام 32 بت سوف تتطلب 4 بايت لكل عنصر ، نظام 64 بت سوف تستخدم 8 بايت لكل عنصر.

وعلاوة على ذلك, كنت بحاجة إلى مساحة لتخزين الفعلية العناصر.هذا يختلف على نطاق واسع.الصغيرة الاعداد الصحيحه (-5 إلى 256 حاليا) ، أي مساحة إضافية مطلوبة ، ولكن أعداد أكبر الثعبان يخصص كائن جديد من أجل كل عدد صحيح ، الذي يأخذ 10-100 بايت و يميل إلى جزء من الذاكرة.

خلاصة القول: الأمر معقد و الثعبان القوائم لا وسيلة جيدة لتخزين كبيرة متجانسة هياكل البيانات.على أن استخدام array وحدة أو إذا كنت بحاجة إلى القيام vectorized الرياضيات استخدام NumPy.

PS - الصفوف على عكس القوائم ، ليست مصممة أن يكون عناصر تدريجيا إلحاق لهم.أنا لا أعرف كيف مخصص يعمل ولكن لا أعتقد حتى عن استخدامه لمدة كبيرة هياكل البيانات :-)

معالجة "المجموعة" جزء من السؤال

إعلان CPython هو PyTuple في نموذجي بناء التكوين يتلخص هذا:

struct PyTuple {
  size_t refcount; // tuple's reference count
  typeobject *type; // tuple type object
  size_t n_items; // number of items in tuple
  PyObject *items[1]; // contains space for n_items elements
};

حجم PyTuple سبيل المثال يتم إصلاحها من خلال هذا البناء ولا يمكن تغييره بعد ذلك.عدد وحدات البايت التي تحتلها PyTuple يمكن احتساب

sizeof(size_t) x 2 + sizeof(void*) x (n_items + 1).

وهذا يعطي الضحلة حجم المجموعة.للحصول على كامل الحجم تحتاج أيضا إلى إضافة إجمالي عدد وحدات البايت التي يستهلكها الكائن البياني الجذور في PyTuple::items[] الصفيف.

ومن الجدير بالذكر أن المجموعة البناء إجراءات التأكد من أن فقط مثيل واحد من فارغة tuple أي وقت مضى خلق (المفرد).

المراجع:بيثون.ح, الكائن.ح, tupleobject.ح, tupleobject.ج

وظيفة جديدة ، getsizeof(), يأخذ بيثون موضوع إرجاع المبلغ من الذاكرة المستخدمة من قبل كائن قياس في بايت.المدمج في الكائنات العودة الصحيح النتائج ؛ الطرف الثالث امتداد لا يجوز ، ولكن يمكن تحديد __sizeof__() طريقة للعودة حجم الكائن.

kveretennicov@nosignal:~/py/r26rc2$ ./python
Python 2.6rc2 (r26rc2:66712, Sep  2 2008, 13:11:55) 
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
>>> import sys
>>> sys.getsizeof(range(1000000))
4000032
>>> sys.getsizeof(tuple(range(1000000)))
4000024

من الواضح عاد الأرقام لا تشمل الذاكرة المستهلكة من قبل الكائنات المضمنة (sys.getsizeof(1) == 12).

هذا هو تنفيذ محددة, أنا متأكد.ومن المؤكد أنه يعتمد على التمثيل الداخلي الأعداد الصحيحة - لا يمكنك أن تفترض أنها سوف تكون تخزين 32 بت منذ الثعبان يعطيك كبيرة بشكل تعسفي الصحيحه لذلك ربما الصغيرة رجات يتم تخزين متقاربة أكثر.

على الثعبان (2.5.1 على فيدورا 9 على core 2 duo) في VmSize قبل تخصيص 6896kB ، بعد 22684kB.بعد مرور أكثر من مليون عنصر المهمة ، VmSize يذهب إلى 38340kB.هذا بشكل صارخ إلى جميع أنحاء 16000kB عن 1000000 الاعداد الصحيحه التي هي حوالي 16 بايت لكل عدد صحيح.التي تشير إلى الكثير النفقات العامة على القائمة.أود أن أغتنم هذه الأرقام مع قرصة كبيرة من الملح.

أنا قلقة من لماذا تسأل ؟ هل تحاول معرفة مقدار الذاكرة سوف تحتاج لفترة معينة التنفيذ ؟ أقول أنت ذاهب لقراءة 10,000,000 الحاجيات و تريد أن تعرف مقدار ذاكرة الوصول العشوائي وسوف تمتص ؟

إذا كان هذا هو الحال, بدلا من محاولة معرفة مقدار ذاكرة الوصول العشوائي كل يأخذ القطعة, معرفة مقدار ذاكرة الوصول العشوائي, يقول, 10,000 الحاجيات يأخذ وتتكاثر حتى الحصول على الحجم الفعلي الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top