استخدم هذه النصائح لتحليل شفرتك واكتشاف الأماكن الأكثر فعالية أو الأقل فعالية.

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

سواء كنت تطور نموذجًا للتعلم الآلي أو موقعًا إلكترونيًا باستخدام Python ، يمكنك تقدير ملف تعريف الذاكرة للنصوص البرمجية أو سطور التعليمات البرمجية الفردية أو الوظائف.

قد يكون تقدير ملف تعريف الذاكرة لقاعدة التعليمات البرمجية بالكامل غير عملي ، حيث يمكن أن يؤدي ذلك إلى إبطاء تطبيقك بشكل كبير. من الأفضل أن تقوم بشكل انتقائي بوظائف ملف التعريف أو الطرق التي تشك في أنها قد تستهلك المزيد من الذاكرة بدلاً من ذلك. ولكن حتى إذا كنت ترغب في القيام بذلك للتطبيق بأكمله ، فقد ترغب في تخصيص وحدة معزولة للتعامل معها.

هناك العديد من مكتبات التنميط في بايثون. بعض من الأكثر شعبية ذاكرة_مُحسِّن, psutil, تارسيمالوك، و بيمبلر. يستخدم هذا البرنامج التعليمي ذاكرة_مُحسِّن و psutil.

instagram viewer

بينما psutil مثالي لتقدير إجمالي استهلاك الذاكرة لطريقة أو تنفيذ وظيفة ، ذاكرة_مُحسِّن يعطي معلومات أكثر تفصيلاً عن استخدام الذاكرة ، بما في ذلك اتجاهات استخدام المستوى الوظيفي سطراً تلو الآخر بمرور الوقت.

للبدء ، قم بتثبيت ذاكرة_مُحسِّن في بيئة Python الافتراضية الخاصة بك. هذا يثبت أيضا psutil.

نقطة تثبيت memory_profiler

احصل على حجم كائن في الذاكرة

يمكنك البدء في تحديد سمات ذاكرتك عن طريق حساب حجم الكائن الذي تنوي استخدامه في الذاكرة أولاً.

هذا النوع من التنميط مفيد في بداية التطوير - أثناء محاولة تحديد نوع الكائن الذي يجب استخدامه في البرنامج.

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

ال sys.getsizeof تأتي الطريقة المدمجة في متناول اليد هنا:

يستورد sys
مطبعة(حجم القائمة f ": {sys.getsizeof ([])} بايت ")
مطبعة(f "حجم القاموس: {sys.getsizeof (ict)} بايت ")
مطبعة(f "حجم المجموعة: {sys.getsizeof (())} بايت ")
مطبعة(f "ضبط الحجم: {sys.getsizeof ({})} بايت ")

ها هو الناتج:

يمكنك أيضًا استخدام ملف sys.getsizeof طريقة لمقارنة حجم الذاكرة لوظيفة مدمجة ومخصصة.

على سبيل المثال ، قارن دالة الطول المخصصة هذه يستخدم Python for loop مع المدمج في لين وظيفة:

يستورد sys

defgetLength(متوقعة):
العد = 0

ل أنا في متوقعة:
العد + =1

يعود عدد

مطبعة(f "وظيفة الطول المضمنة: {sys.getsizeof (len)} بايت ")
مطبعة(f "وظيفة الطول المخصص: {sys.getsizeof (getLength)} بايت ")

يعطي الكود أعلاه الناتج التالي:

ومع ذلك ، في حين sys.getsizeof يقيس حجم الكائن في الذاكرة ، فهو يراعي فقط الكائن نفسه وليس أولئك الذين يشيرون إليه. لذلك ، ستحتاج إلى طريقة تحديد أكثر تفصيلاً.

ابحث عن ملف تعريف الذاكرة لوظيفة Python

يمكنك الحصول على ملف تعريف ذاكرة أكثر تفصيلاً لكل سطر رمز لوظيفة باستخدام ذاكرة_مُحسِّن طَرد. هذا ينطوي على إضافة @حساب تعريفي مصمم لوظيفتك أو طريقتك:

استيراد الباندا
استيراد numpy
من ملف تعريف الاستيراد memory_profiler

التلاعب في الفصل:
@حساب تعريفي
def manipulateData (ذاتي):
مد = الباندا. إطار البيانات ({
'A': [0، 3، numpy.nan، 10، 3، numpy.nan]،
'B': [numpy.nan، "Pandas"، numpy.nan، "Pandas"، "Python"، "JavaScript"]،
})

df.fillna (الطريقة = 'bfill' ، inplace = True)
df.fillna (الطريقة = 'ffill' ، inplace = True)
شارع العودة (مدافع)

manip = معالجة ()
طباعة (manip.manipulateData ())

يعطي الكود أعلاه ملف تعريف ذاكرة مفصل لكل سطر من التعليمات البرمجية في الوظيفة كما هو موضح:

ال استخدام الذاكرة يشير العمود إلى استخدام الذاكرة لسطر رمز معين ، بينما يشير ملف زيادة راتب يُظهر العمود النفقات العامة التي يساهم بها كل سطر. ال حادثة العمود عدد المرات التي يخصص فيها سطر الرمز الذاكرة أو يلغي تخصيصها.

على سبيل المثال ، في الإخراج أعلاه ، حدث السطر 11 مرتين مع زيادة الذاكرة 0.1 ميبي بايت (ميبي بايت) ، مما أدى إلى زيادة استخدام الذاكرة إلى 55.4 ميبي بايت. ساهم الخطان 19 و 22 أيضًا بـ 0.2 ميجابايت و 0.3 ميجابايت ، على التوالي ، بإجمالي استخدام الذاكرة إلى 55.9 ميجابايت.

ابحث عن ملف تعريف الذاكرة لبرنامج Python النصي حسب الطابع الزمني

يمكنك أيضًا تقدير ملف تعريف الذاكرة لنص Python النصي بأكمله باستخدام ذاكرة_مُحسِّن عن طريق تشغيل mprof الأمر في المحطة كما هو موضح:

mprof قم بتشغيل script_name.py

يقوم الأمر أعلاه بأخذ عينات من البرنامج النصي المحدد كل 0.1 ثانية ويقوم تلقائيًا بإنشاء ملف .dat ملف داخل دليل مشروعك الحالي.

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

يمكنك أيضًا الحصول على قطعة من ملف تعريف الذاكرة. هذا يتطلب تثبيت matplotlib:

نقطة تثبيت matplotlib

بمجرد التثبيت ، قم بتشغيل mprof الأمر مثل ذلك:

مؤامرة mprof

هذا هو الناتج في هذه الحالة:

قم بتشغيل ملف تعريف ذاكرة البرنامج النصي في ملف Python المخصص

قد ترغب في إنشاء ملف تعريف لنصوص Python النصية المختلفة. انت تستطيع فعل ذالك باستخدام وحدة Python المخصصة عبر بايثون عملية فرعية.

بهذه الطريقة ، يمكنك فصل ملف تعريف الذاكرة عن قاعدة التعليمات البرمجية الخاصة بك وحفظ إخراج الرسم البياني محليًا:

يستورد عملية فرعية

subprocess.run ([
"mprof", 'يجري', "- بما في ذلك الأطفال", "مفقود. py"
])

# حفظ ناتج قطعة الأرض محليا
subprocess.run (["mprof", 'حبكة', '--output = output.jpg'])

لتشغيل ملف تعريف ذاكرة البرنامج النصي ، ما عليك سوى تشغيل ملف Python الذي يحتوي على الكود أعلاه. هذا يولد مخطط ملف تعريف الذاكرة (الإخراج. jpg) في دليل الملفات:

ابحث عن مقدار الذاكرة المستخدمة من تنفيذ الوظيفة

يمكنك العثور على ملف تعريف الذاكرة الإجمالية لطريقة أو وظيفة أثناء التنفيذ باستخدام psutil طَرد.

على سبيل المثال ، لتوصيف السابق معالجة Pandas DataFrame الطريقة داخل ملف Python آخر:

يستورد psutil
يستورد sys
يستورد نظام التشغيل
sys.path.append (sys.path [0] + "/..")

# استيراد الفئة التي تحتوي على طريقتك
من سوميكود يستورد يتلَاعب ب

# إنشاء الفصل الدراسي
manip = معالجة ()

عملية = psutil. عملية (os.getpid ())
initial_memory = process.memory_info (). rss

# قم بتشغيل الطريقة المستهدفة:
manip.manipulateData ()

# الحصول على معلومات الذاكرة بعد التنفيذ
final_memory = process.memory_info (). rss
memory_consumed = final_memory - الذاكرة_ الأولية
memory_consumed_mb = memory_consumed / (1024 * 1024)
مطبعة(f "الذاكرة التي تستهلكها الوظيفة: {memory_consumed_mb:.2F} ميغا بايت ")

ما سبق يقدّر ملف تعريف الذاكرة الإجمالي للطريقة بالميغابايت (MB) كما هو موضح:

ابحث عن ملف تعريف الذاكرة لسطر كود في Jupyter Notebook

إذا كنت تستخدم iPython في Jupyter Notebook ، فيمكنك حساب ملف تعريف الذاكرة لخط واحد باستخدام ذاكرة_مُحسِّن. ما عليك سوى التحميل ذاكرة_مُحسِّن في خلية واحدة. ثم أضف ملف ٪ memit وظيفة سحرية إلى التعليمات البرمجية الخاصة بك في الخلايا اللاحقة ؛ هذا يعيد الذاكرة القصوى للرمز والحجم المتزايد.

لا تعمل هذه الطريقة مع برامج Python النصية العادية إلى جانب iPython في Jupyter Notebook.

على سبيل المثال:

يمكنك أيضًا استخدام ملف ٪ memit وظيفة سحرية في دفتر ملاحظات Jypyter لتوصيف ذاكرة الوظيفة في وقت التشغيل:

تحسين كفاءة الذاكرة الخاصة بك في كود بايثون الخاص بك

بالنظر إلى مهام رفع البيانات الشاقة التي نستخدمها غالبًا Python ، يحتاج كل سطر كود إلى تحسين مناسب لإدارة استخدام الذاكرة. بينما تتميز Python بالعديد من وظائف Python المضمنة ، تؤدي الكائنات غير المرجعية إلى تسرب الذاكرة.

إذا كنت قد أسقطت كل بنية Python التي تعمل في قاعدة التعليمات البرمجية الخاصة بك دون التفكير في استخدام الذاكرة ، فقد ترغب في الرجوع إلى الوراء قبل أن تذهب بعيدًا.