شعار زيفيرنت

مقدمة لتنميط الذاكرة في بايثون - KDnuggets

التاريخ:

مقدمة لتنميط الذاكرة في بيثون
صورة المؤلف
 

يعد إنشاء ملفات تعريف كود Python مفيدًا لفهم كيفية عمل الكود وتحديد فرص التحسين. من المحتمل أنك قمت بتعريف نصوص بايثون الخاصة بك لـ المقاييس المرتبطة بالوقت- قياس أوقات تنفيذ أقسام محددة من التعليمات البرمجية. 

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

في هذا البرنامج التعليمي، سنستكشف إنشاء ملفات تعريف كود Python لاستخدام الذاكرة باستخدام حزمة Python ملف تعريف الذاكرة.

لنبدأ بتثبيت حزمة Python لملف تعريف الذاكرة باستخدام النقطة:

pip3 install memory-profiler

 

ملاحظات: تثبيت ملف تعريف الذاكرة في ملف مخصص بيئة افتراضية للمشروع بدلاً من البيئة العالمية الخاصة بك. سنستخدم أيضًا إمكانيات التخطيط المتاحة في ملف تعريف الذاكرة لتخطيط استخدام الذاكرة، وهو ما يتطلب matplotlib. لذا تأكد من تثبيت matplotlib أيضًا في البيئة الافتراضية للمشروع.

لنقم بإنشاء برنامج نصي بلغة Python (على سبيل المثال main.py) باستخدام وظيفة process_strs:

  • تقوم الوظيفة بإنشاء سلسلتين بايثون طويلتين للغاية str1 و str2 ويربط بينهما. 
  • حجة الكلمة الرئيسية reps يتحكم في عدد المرات التي سيتم فيها تكرار السلاسل المشفرة لإنشاءها str1 و str2. ونعطيها القيمة الافتراضية 10**6 والتي سيتم استخدامها إذا كانت الدالة المطلوبة لا تحدد قيمة reps.
  • ثم نقوم بحذف صراحة str2
  • تقوم الدالة بإرجاع السلسلة المتسلسلة str3.
# main.py

from memory_profiler import profile

@profile
def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

 

من المفترض أن يمنحك تشغيل البرنامج النصي نتيجة مماثلة: 

 

مقدمة لتنميط الذاكرة في بيثون
 

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

تشغيل الأمر mprof 

بدلاً من تشغيل برنامج Python النصي كما هو موضح أعلاه، يمكنك أيضًا تشغيل ملف mprof الأمر مثل ذلك:

mprof run --python main.py

 

عند تشغيل هذا الأمر، يجب أن تكون قادرًا أيضًا على رؤية ملف .dat الذي يحتوي على بيانات استخدام الذاكرة. سيكون لديك ملف .dat واحد في كل مرة تقوم فيها بتشغيل الملف mprof الأمر - يتم تحديده بواسطة الطابع الزمني.

 

مقدمة لتنميط الذاكرة في بيثون

رسم استخدام الذاكرة 

في بعض الأحيان يكون من الأسهل تحليل استخدام الذاكرة من قطعة أرض بدلاً من النظر إلى الأرقام. تذكر أننا ناقشنا أن matplotlib هو تبعية مطلوبة لاستخدام إمكانيات التخطيط. 

يمكنك استخدام mprof plot أمر لرسم البيانات في ملف .dat وحفظها في ملف صورة (هنا Output.png):

mprof plot -o output.png

 

افتراضيا، mprof plot استخدم البيانات من أحدث تشغيل لـ mprof أمر.

 

مقدمة لتنميط الذاكرة في بيثون
 

يمكنك رؤية الطوابع الزمنية المذكورة في المؤامرة أيضًا.

تسجيل ملف تعريف استخدام الذاكرة إلى ملف سجل

وبدلاً من ذلك، يمكنك تسجيل إحصائيات استخدام الذاكرة إلى ملف سجل مفضل في دليل العمل. هنا نقوم بإنشاء معالج الملفات mem_logs إلى ملف السجل، وقم بتعيين stream حجة في @profile الديكور إلى معالج الملف:

# main.py

from memory_profiler import profile

mem_logs = open('mem_profile.log','a')

@profile(stream=mem_logs)
def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

 

عندما تقوم الآن بتشغيل البرنامج النصي، يجب أن تكون قادرًا على رؤية ملف mem_profile.log في دليل العمل الخاص بك بالمحتويات التالية:

 

مقدمة لتنميط الذاكرة في بيثون

يمكنك أيضا استخدام memory_usage() دالة لفهم الموارد المطلوبة لتنفيذ وظيفة معينة — أخذ عينات منها على فترات زمنية منتظمة.

memory_usage تأخذ الوظيفة الوظيفة في ملف التعريف والوسائط الموضعية والكلمات الرئيسية على شكل صف.

هنا، نود أن نجد استخدام الذاكرة لـ process_strs تعمل مع وسيطة الكلمة الأساسية reps اضبط على 10**7. قمنا أيضًا بتعيين الفاصل الزمني لأخذ العينات على 0.1 ثانية:

# main.py

from memory_profiler import memory_usage

def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

mem_used = memory_usage((process_strs,(),{'reps':10**7}),interval=0.1)
print(mem_used)

 

إليك الإخراج المقابل:

Output >>>
[21.21875, 21.71875, 147.34375, 277.84375, 173.93359375]

 

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

# main.py

from memory_profiler import memory_usage

def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

mem_used = memory_usage((process_strs,(),{'reps':10**7}),interval=0.01)
print(mem_used)

 

يجب أن تكون قادرًا على رؤية مخرجات مماثلة:

Output >>>
[21.40234375, 21.90234375, 33.90234375, 46.40234375, 59.77734375, 72.90234375, 85.65234375, 98.40234375, 112.65234375, 127.02734375, 141.27734375, 155.65234375, 169.77734375, 184.02734375, 198.27734375, 212.52734375, 226.65234375, 240.40234375, 253.77734375, 266.52734375, 279.90234375, 293.65234375, 307.40234375, 321.27734375, 227.71875, 174.1171875]

في هذا البرنامج التعليمي، تعلمنا كيفية البدء في تحديد ملفات تعريف البرامج النصية لـ Python لاستخدام الذاكرة.

وعلى وجه التحديد، تعلمنا كيفية القيام بذلك باستخدام حزمة ملف تعريف الذاكرة. استخدمنا @profile مصمم ديكور و memory_usage() وظيفة للحصول على استخدام الذاكرة لنموذج البرنامج النصي بيثون. لقد تعلمنا أيضًا كيفية استخدام الإمكانات مثل تخطيط استخدام الذاكرة والتقاط الإحصائيات في ملف سجل.

إذا كنت مهتمًا بتحديد مواصفات نص Python الخاص بك لأوقات التنفيذ، ففكر في القراءة التنميط رمز بايثون باستخدام timeit وcProfile.
 
 

بالا بريا سي مطور وكاتب تقني من الهند. تحب العمل في تقاطع الرياضيات والبرمجة وعلوم البيانات وإنشاء المحتوى. تشمل مجالات اهتمامها وخبرتها DevOps وعلوم البيانات ومعالجة اللغة الطبيعية. تستمتع بالقراءة والكتابة والترميز والقهوة! تعمل حاليًا على التعلم ومشاركة معرفتها مع مجتمع المطورين من خلال تأليف برامج تعليمية وأدلة إرشادية ومقالات رأي والمزيد.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة