ما هو ملف تعريف ذاكرة Python الموصى به؟[مغلق]
-
02-07-2019 - |
سؤال
أريد أن أعرف استخدام الذاكرة لتطبيق Python الخاص بي وأريد على وجه التحديد معرفة كتل/أجزاء التعليمات البرمجية أو الكائنات التي تستهلك معظم الذاكرة.يظهر بحث جوجل تجاريًا مدقق ذاكرة بايثون (ويندوز فقط).
وتلك مفتوحة المصدر بايسيزر و هيبي.
لم أجرب أحدًا، لذلك أردت أن أعرف أيهما أفضل:
يعطي معظم التفاصيل.
لا بد لي من إجراء تغييرات قليلة أو معدومة على الكود الخاص بي.
المحلول
هيبي سهل الاستخدام للغاية.في مرحلة ما من التعليمات البرمجية الخاصة بك، عليك أن تكتب ما يلي:
from guppy import hpy
h = hpy()
print h.heap()
يمنحك هذا بعض المخرجات مثل هذا:
Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 35144 27 2140412 26 2140412 26 str
1 38397 29 1309020 16 3449432 42 tuple
2 530 0 739856 9 4189288 50 dict (no owner)
يمكنك أيضًا معرفة المكان الذي تتم الإشارة فيه إلى الكائنات والحصول على إحصائيات حول ذلك، ولكن بطريقة ما تكون المستندات المتعلقة بذلك قليلة بعض الشيء.
يوجد أيضًا متصفح رسومي مكتوب باللغة Tk.
نصائح أخرى
وبما أن أحدا لم يذكر ذلك سأشير إلى وحدتي Memory_profiler وهو قادر على طباعة تقرير استخدام الذاكرة سطرًا تلو الآخر ويعمل على نظامي Unix وWindows (يحتاج إلى psutil في هذا الأخير).الإخراج ليس مفصلاً للغاية ولكن الهدف هو إعطائك نظرة عامة على المكان الذي يستهلك فيه الكود المزيد من الذاكرة وليس تحليلًا شاملاً للكائنات المخصصة.
بعد تزيين وظيفتك مع @profile
وتشغيل التعليمات البرمجية الخاصة بك مع -m memory_profiler
ضع علامة على أنه سيطبع تقريرًا سطرًا بسطر مثل هذا:
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
أوصي قنقن.من السهل جدًا إعداده، ولن تحتاج إلى أي تغييرات على الكود الخاص بك.يمكنك عرض أعداد الكائنات من كل نوع عبر الزمن، وعرض قائمة الكائنات الحية، وعرض المراجع إلى الكائنات الحية، كل ذلك من واجهة الويب البسيطة.
# memdebug.py
import cherrypy
import dowser
def start(port):
cherrypy.tree.mount(dowser.Root())
cherrypy.config.update({
'environment': 'embedded',
'server.socket_port': port
})
cherrypy.server.quickstart()
cherrypy.engine.start(blocking=False)
يمكنك استيراد memdebug، واستدعاء memdebug.start.هذا كل شئ.
لم أجرب PySizer أو Heapy.وسأكون ممتنا لمراجعات الآخرين.
تحديث
الكود أعلاه مخصص لـ CherryPy 2.X
, CherryPy 3.X
ال server.quickstart
تمت إزالة الطريقة و engine.start
لا يأخذ blocking
علَم.لذلك إذا كنت تستخدم CherryPy 3.X
# memdebug.py
import cherrypy
import dowser
def start(port):
cherrypy.tree.mount(dowser.Root())
cherrypy.config.update({
'environment': 'embedded',
'server.socket_port': port
})
cherrypy.engine.start()
النظر في objgraph المكتبة (انظر http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks على سبيل المثال حالة الاستخدام).
مابي هو (آخر) ملف تعريف استخدام الذاكرة لبيثون.ينصب تركيز مجموعة الأدوات هذه على تحديد حالات تسرب الذاكرة.
يحاول Muppy مساعدة المطورين على تحديد تسرب الذاكرة لتطبيقات Python.فهو يتيح تتبع استخدام الذاكرة أثناء وقت التشغيل وتحديد الكائنات التي تتسرب.بالإضافة إلى ذلك، يتم توفير الأدوات التي تسمح بتحديد مصدر الكائنات التي لم يتم إصدارها.
أقوم بتطوير ملف تعريف الذاكرة لـ Python يسمى memprof:
http://jmdana.github.io/memprof/
يسمح لك بتسجيل وتخطيط استخدام الذاكرة للمتغيرات الخاصة بك أثناء تنفيذ الأساليب المزخرفة.عليك فقط استيراد المكتبة باستخدام:
from memprof import memprof
وتزيين طريقتك باستخدام:
@memprof
وهذا مثال على كيفية ظهور المؤامرات:
تتم استضافة المشروع في جيثب:
حاول أيضًا مشروع بيتراسيمالوك والذي يوفر استخدام الذاكرة لكل رقم سطر بايثون.
تحرير (2014/04):أصبح لديه الآن واجهة المستخدم الرسومية Qt لتحليل اللقطات.