اذهب إلى المحتوى
  • 0

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

Fahmy Mostafa

السؤال

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

بحثت في جوجل ووجدك مكتبات مثل PySizer وHeapy ولكن لم أعرف كيف أستعملها أو أيهما أفضل (أسرع أو ينتج تقرير مفصل أكثر)؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

إضافة للإجابات في الأعلى.
سأتحدث عن مكتبة psutil كونها تعمل على مختلف أنظمة التشغيل، حيث توفر واجهة لاسترداد المعلومات حول العمليات الجارية واستخدام النظام (وحدة المعالجة المركزية والذاكرة).

import psutil
# استخدام المعالج
print(psutil.cpu_percent()) # 15.3
# عرض نسبة استخدام الذاكرة
print(psutil.virtual_memory().percent)  # 71.1
# حساب المساحة المتوفرة من الذاكرة
psutil.virtual_memory().available * 100 / psutil.virtual_memory().total   # 28.76908537555775
# يمكنك عرض معلومات كاملة
psutil.virtual_memory()
# svmem(total=4169424896, available=1228451840, percent=70.5, used=2940973056, free=1228451840)

ولمستخدمي لينوكس يمكنهم أيضاً استخدام مكتبة os:

import os
# استخدام المعالج
cpu=str(round(float(os.popen('''grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage }' ''').readline()),2))
#print results
print("usage :" + cpu)
# استخدام الذاكرة
# os.popen()
# الحصول على كل معلومات الذاكرة 
total_memory, used_memory, free_memory = map(
	int, os.popen('free -t -m').readlines()[-1].split()[1:])
# استخدام الذاكرة
print("RAM memory % used:", round((used_memory/total_memory) * 100, 2))

ويمكنك الحصول على معلومات مفصلة للتحليل ولعرض استخدام الذاكرة لكل سطر باستخدام وحدتي profile line_profiler  وmemory_profiler بالطريقة التالية:
 اكتب برنامج python المراد اختباره ، والوظيفة المراد اختبارها وأضف أعلاها @ profile ، ثم احفظها كملف py.
ثم ضع في سطر الأوامر commandline أو في محرر الأكواد:

kernprof -l -v *.py

ستتم طباعة تحليل الأداء وطباعة نتائج البرنامج.
مثال، سنكتب تابع صغير ثم سنحفظه باسم ali.py

@profile
def com():
    for i in range(10):
        print(i**4)
if __name__=='__main__':
    com()

ثم ضع في سطر الأوامر Command Line أو في محرر الأكواد.

kernprof -l -v ali.py
'''
Wrote profile results to test.py.lprof
Timer unit: 1e-06 s

Total time: 0.012405 s
File: test.py
Function: compute at line 1

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     1                                           @profile
     2                                           def compute():
     3       101         74.0      0.7      0.6      for i in range(10):
     4       100      12331.0    123.3     99.4          print(i**4)
'''
Timer unit : وحدة الموقت ، ميكروثانية
Total time 	:إجمالي وقت تشغيل الكود 
Time 	: زمن تشغيل السطر
Hits: Number of runs
% Time: النسبة المئوية لزمن تشغيل السطر

ويمكنك استخدام  بنفس الطريقة لكن نضع:

python -m memory_profiler ali.py
'''
Line #    Mem usage    Increment   Line Contents
================================================
     2    39.08 MiB    39.08 MiB   @profile(precision=2)
     3                             def compute():
     4    39.08 MiB     0.00 MiB       for i in range(100):
     5    39.08 MiB     0.00 MiB       print(i**3)
'''
Increment:  زيادة الذاكرة أو نقصانها بعد تشغيل كل سطر من التعليمات البرمجية
Mem usage: استخدام الذاكؤة لكل سطر


يمكنك تثبيت المكتبات كالتالي:

pip install line_profiler
pip install memory_profiler

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكنك استخدام guppy3 لذلك وهي سهلة الاستخدام, ولكن يجب أن يكون لديك Python 3.6 أو 3.7 أو 3.8 أو 3.9, ثثم تحتاج الى تثبيتها من خلال الأمر الآتي
باستخدام pip 

pip install guppy3

أو باستخدام conda 

conda install -c conda-forge guppy3

ثم تحتاج الى استدعاءها كالتالي

from guppy import hpy; h=hpy()

ثم استخدامها بالشكل الآتي

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)

يمكنك أيضا معرفة المكان الذي تتم فيه الإشارة إلى الكائنات والحصول على إحصائيات عنها

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

في إصدار 3.4 من بايثون يوجد وحدة جديدة تسمى tracemalloc ، حيث تقوم بتوفير إحصاءات مفصلة عن أي جزء من الكود يقوم بإستخدام أكبر قدر من الذاكرة ، وهذا مثال لكيفية إستخدمها

import tracemalloc

tracemalloc.start()

# ... قم بتشغيل تطبيقك ...

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

print("[ أكبر 10 مستهلكين للذاكرة]")
for stat in top_stats[:10]:
    print(stat)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...