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

muh*_*huk 9 python django profiling

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

python -m cProfile manage.py testrender
Run Code Online (Sandbox Code Playgroud)

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

from django.core.management.base import BaseCommand, CommandError
Run Code Online (Sandbox Code Playgroud)

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

muh*_*huk 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)
Run Code Online (Sandbox Code Playgroud)

这种方式分析统计信息是在范围内收集的_handle.所以代替:

python -m cProfile manage.py testrender
Run Code Online (Sandbox Code Playgroud)

我必须跑:

python manage.py testrender --profile
Run Code Online (Sandbox Code Playgroud)

哪个更好.

  • 似乎这对Django的更改不再有效,但我从中想出来了.[这是一个更新的例子](https://gist.github.com/4236077). (2认同)