باستخدام نتائج CProfile مع kcachegrind
-
19-09-2019 - |
سؤال
أنا أستخدم cprofile إلى الملف الشخصي لبرنامج Python الخاص بي. بناء على هذا الكلام كنت تحت الانطباع بأن kcachegrind يمكن أن تحليل وعرض الإخراج من CProfile.
ومع ذلك، عندما أذهب لاستيراد الملف، يعرض KCachegrind خطأ "تنسيق ملف غير معروف" في شريط الحالة ويجلس هناك عرض لا شيء.
هل هناك شيء خاص أحتاج إلى القيام به قبل أن تكون إحصائيات التنميط متوافقة مع KCachegrind؟
...
if profile:
import cProfile
profileFileName = 'Profiles/pythonray_' + time.strftime('%Y%m%d_%H%M%S') + '.profile'
profile = cProfile.Profile()
profile.run('pilImage = camera.render(scene, samplePattern)')
profile.dump_stats(profileFileName)
profile.print_stats()
else:
pilImage = camera.render(scene, samplePattern)
...
إصدارات الحزمة
- kcachegrind 4.3.1.
- بيثون 2.6.2.
المحلول 3
يمكن القيام به باستخدام وحدة نمطية تسمى lscallproftree.
تشرح هذه المقالة كيف: Cherrypy - Cachegrind.
مع رمزي الناتج يبحث مثل ذلك:
...
if profile:
import cProfile
import lsprofcalltree
profileFileName = 'Profiles/pythonray_' + time.strftime('%Y%m%d_%H%M%S') + '.profile'
profile = cProfile.Profile()
profile.run('pilImage = camera.render(scene, samplePattern)')
kProfile = lsprofcalltree.KCacheGrind(profile)
kFile = open (profileFileName, 'w+')
kProfile.output(kFile)
kFile.close()
profile.print_stats()
else:
pilImage = camera.render(scene, samplePattern)
...
إذا كان أي شخص يعرف طريقة للقيام بذلك، فلا يحتاج إلى وحدة خارجية (أي لا يتم شحنها مع Python)، ما زلت مهتما جدا بسماع ذلك.
نصائح أخرى
باستخدام CProfile، يمكنك أيضا البرامج الموجودة أيضا، دون إجراء أي برنامج نصي منفصلا منفصلا. فقط تشغيل البرنامج مع profiler
python -m cProfile -o profile_data.pyprof script_to_profile.py
وفتح بيانات الملف الشخصي في kcachegrind مع pyprof2calltree، الذي يفتح مفتاح التبديل تلقائيا البيانات تلقائيا في kcachegrind
pyprof2calltree -i profile_data.pyprof -k
على سبيل المثال، سيتم تنميط خادم Paster بالكامل وسيتم تنفيذ WebApp مثل هذا
python -m cProfile -o pyprof.out `which paster` serve development.ini
Pyprof2Calltree يمكن تثبيتها مع Easy_Install.
يمكنك استخدام profilestats.profile
ديكور ($ pip install profilestats
) - غلاف بسيط ل pyprof2calltree. الوحدة (إعادة صياغة lsprofcalltree.py
):
from profilestats import profile
@profile
def func():
# do something here
البرنامج النصي يمكن تشغيله كالمعتاد. profilestats
ينشئ ملفين: cachegrind.out.profilestats
و profilestats.prof
في تنسيقات متوافقة مع KCachegrind و CProfile في المقابل.
إذا كنت تحاول فعلا القيام به هو معرفة أجزاء من التعليمات البرمجية التي يمكن تحسينها للسرعة، ويمكنك إيقافها مؤقتا في المصحح، هذه الطريقة تعمل. وبعد قد يكون من المستغرب، لكنك لا تحتاج إلى العديد من Stackshots.
3 يختلف طرق لملف تعريف التعليمات البرمجية الخاصة بك وتصور النتائج في kcachegrind / qcachegrind:
أنا - CPROFILE
1 - الملف الشخصي MyFunc () من iPython
import cProfile
filename = 'filename.prof'
cProfile.run('myfunc()', filename)
2 - تحويل ملفك إلى ملف kcachegrind قابل للاستخدام في قذيفة
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - فتح Callgrind.filename.prof في KCachegrind
ثانيا - CPROFILE
1 - الملف الشخصي خطوط قليلة في التعليمات البرمجية الخاصة بك.
import cProfile
filename = 'filename.prof'
pr = cProfile.Profile()
pr.enable()
# ... lines to profile ...
pr.disable()
pr.dump_stats(filename)
2 - تحويل ملفك إلى ملف kcachegrind قابل للاستخدام في قذيفة
sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof
3 - فتح Callgrind.filename.prof في KCachegrind
III - Yappi.
1 - ملف MyFunc () من iPython أو من التعليمات البرمجية الخاصة بك
import yappi
filename = 'callgrind.filename.prof'
yappi.set_clock_type('cpu')
yappi.start(builtins=True)
myfunc()
stats = yappi.get_func_stats()
stats.save(filename, type='callgrind')
2 - فتح Callgrind.filename.prof في kcachegrind