如何独家配置Django自定义管理命令

时间:2009-11-06 11:54:57

标签: python django profiling

我想分析一个相对CPU密集型的自定义管理命令(使用PIL渲染图像)。当我使用以下命令时,我在我的分析结果中获得了各种Django模块(admin,ORM等):

python -m cProfile manage.py testrender

我删除了所有可能导入Django的导入,但我猜测以下是罪魁祸首:

from django.core.management.base import BaseCommand, CommandError

有没有办法过滤掉cProfile结果? (只显示文件名,没有路径)或者,是否有其他方法可以从分析中排除/包含相应的模块/包?

3 个答案:

答案 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功能。