我想分析一个相对CPU密集型的自定义管理命令(使用PIL渲染图像)。当我使用以下命令时,我在我的分析结果中获得了各种Django模块(admin,ORM等):
python -m cProfile manage.py testrender
我删除了所有可能导入Django的导入,但我猜测以下是罪魁祸首:
from django.core.management.base import BaseCommand, CommandError
有没有办法过滤掉cProfile
结果? (只显示文件名,没有路径)或者,是否有其他方法可以从分析中排除/包含相应的模块/包?
答案 0 :(得分:17)
我通过以下方式解决了这个问题:
from cProfile import Profile
from django.core.management.base import BaseCommand
class Command(BaseCommand):
...
def _handle(self, *args, **options):
# Actual code I want to profile
pass
def handle(self, *args, **options):
if options['profile']:
profiler = Profile()
profiler.runcall(self._handle, *args, **options)
profiler.print_stats()
else:
self._handle(*args, **options)
这种方式可以在_handle
的范围内收集分析统计信息。所以而不是:
python -m cProfile manage.py testrender
我必须跑:
python manage.py testrender --profile
哪个更好。
答案 1 :(得分:0)
如果我找不到任何答案。 Gprof2Dot explained here可以是可接受的黑客。
它不会过滤掉我不感兴趣的模块,但希望它能够更容易地检查结果,直观地分离我的代码和Django模块。
答案 2 :(得分:0)
将PIL功能分离到其自己的模块中的自己的函数/类中,并从管理命令中导入它。然后,您可以独立于Django测试/分析PIL功能。