【问题标题】:How to profile django application with respect to execution time?如何根据执行时间分析 django 应用程序?
【发布时间】:2012-06-03 17:25:16
【问题描述】:

我的 Django 应用程序非常慢,我想知道什么需要时间:

我尝试了Django-debug-toolbar,但找不到可以让我中断加载时间的面板。

我的要求:

  • 一个堆栈跟踪类型的输出,其中包含为呈现页面而调用的每个模块的执行时间。
  • 我想了解整个页面渲染过程的哪个部分占用了时间?
  • 另外,哪个部分消耗了多少 CPU [最重要]?

django-debug-toolbar 可以这样做吗? [什么面板? ]

任何其他 django-app 可以做到这一点?

【问题讨论】:

标签: python django performance cpu-speed django-debug-toolbar


【解决方案1】:

django-debug-toolbar2.0

默认情况下,django-debug-toolbar 2.0 在设置DEBUG_TOOLBAR_PANELS 中包含'debug_toolbar.panels.profiling.ProfilingPanel'。您可以通过勾选工具栏中的“Profiling”复选框并刷新页面来查看此分析信息。

django-debug-toolbar的旧版本:

您可以尝试 django-debug-toolbar 的分析面板(确保您使用来自github 的应用程序的最新版本)。像这样在你的 settings.py 中启用面板:

DEBUG_TOOLBAR_PANELS = (
  'debug_toolbar.panels.version.VersionDebugPanel',
  'debug_toolbar.panels.timer.TimerDebugPanel',
  'debug_toolbar.panels.profiling.ProfilingDebugPanel',
)

这个面板的存在没有记录在 django-debug-toolbar 的自述文件中;这就是为什么我首先在​​这里回答。

【讨论】:

  • 注:如果您使用的是 Debian 或 Ubuntu,您还需要 apt-get install python-profiler 来获取 profilepstats 模块,因为它们具有非免费许可证(感谢 Disney)。
【解决方案2】:

终于找到了一种分析我的 django webapp 的方法:

以下 2 个 django sn-ps 提供 middleware 来分析整个流程并在以下情况下输出 请求在GET keys 中有prof

简单明了的分析 - 拯救了我的一天!

【讨论】:

  • 谢谢。这是我长期以来看到的最有价值的提示之一。太简单了,我不敢相信我一直在编写没有分析的 Django 应用程序。
  • 你能解释一下如何配置它吗?只是把那个文件放在某个地方?
【解决方案3】:

我建议改为编写一些集成测试,或者至少使用内置的测试客户端来自动化请求并在视图中放置大量调试语句

Django 有一个内置的测试客户端:

from django.test.client import Client
c = Client()
response = c.post('/slow_url/')

然后在你看来:

def slow_url(request):
    start = time.time()
    print 'Started db query'
    result = SomeComplexModel.objects.all()
    print 'Finished db query, took ', time.time() - start
    return render('some_complex_template.html', {'result': result})  

自动化发出请求的过程并能够在您进行小的更改时一次又一次地复制它们是您改进代码的方式。如果您测量运行每个函数所需的时间,则可以计算出 CPU 时间。您很快就可以了解实际消耗资源的部分。

【讨论】:

  • 这是一种显而易见的方法,但似乎并不实用。
  • 因为我在寻找分析工具,所以我总是可以手动完成!
  • 如果您还没有编写任何单元或集成测试,那么您真的应该考虑开始...
  • 没关系,我知道测试的重要性——但这不是我问题的答案。我已经进行了测试,但是如果我必须暂时放置时间戳,那么我可以在我的视图中这样做。
【解决方案4】:

这不是分析,但我通常只是使用视图来计算执行时间,它也适用于视图 需要用户登录,它会在一个简单的页面中显示执行时间

 def test(request):
     from django.test.client import Client
     import time

     c = Client()

     #client login if needed
     response = c.post('/login/', {'username': 'admin', 'password': 'password'})

     start = time.time()
     response = c.get('/pagetotest/')

     #print response
     #print 'Finished, time: ', time.time() - start # output to console
     end=time.time() - start
     return render(request,'loadingtime.html',{'time':end})

我认为这是一个好的开始,希望它对某人有所帮助

【讨论】:

    【解决方案5】:

    django-silk 可以提供帮助。

    • 安装它:pip install django-silk
    • 添加到settings.py
    MIDDLEWARE = [
        ...
        'silk.middleware.SilkyMiddleware',
        ...
    ]
    
    INSTALLED_APPS = (
        ...
        'silk'
    )
    
    • urls.py中添加路由:
    urlpatterns += [url(r'^silk/', include('silk.urls', namespace='silk'))]
    
    • 最后,在数据库中创建足够的表:
    python manage.py makemigrations
    python manage.py migrate
    

    然后,您可以在 Internet 浏览器中浏览到 /silk 以找到那里请求的页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-14
      • 2013-03-06
      • 2011-01-24
      • 1970-01-01
      • 2019-01-26
      • 2020-07-31
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多