سؤال

أنا أستخدم 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top