Python django非常慢
一些评测显示模板呈现是罪魁祸首。(我正在尝试只包含缓存查询的页面。) 但是,模板仍然非常简单。 最复杂的部分是运行10次的嵌套循环,但是如果一切顺利,嵌套循环就不会运行,因为它是缓存的。(就像在我的测试中) 就是Python django非常慢,python,django,django-templates,Python,Django,Django Templates,一些评测显示模板呈现是罪魁祸首。(我正在尝试只包含缓存查询的页面。) 但是,模板仍然非常简单。 最复杂的部分是运行10次的嵌套循环,但是如果一切顺利,嵌套循环就不会运行,因为它是缓存的。(就像在我的测试中) 就是 {% for p in posts %} --{{p.by.username}} --{{p.text}} {% cache 600 p p.timestamp %} {% for img in p.images.all %} --{{img.path}}
{% for p in posts %}
--{{p.by.username}}
--{{p.text}}
{% cache 600 p p.timestamp %}
{% for img in p.images.all %}
--{{img.path}}
{% endfor %}
{% endcache %}
{% endfor %}
我在开发服务器上获得了此页面的约80个请求/秒。
(我发现我可以在生产部署中将该数字乘以3)
为了进行比较,对于一个只包含一个短静态字符串的普通模板,我得到了1000req/s
这是一个已知的问题吗?我该如何去纠正/避免它呢?(显然我还没有“业力”到发表评论的程度,或者我会将此作为评论而不是答案发表)
您能否详细说明“仅缓存查询”的含义
除此之外,在我看来,您的问题可能是在模板渲染过程中经常碰到数据库
{% for p in posts %}
--{{p.by.username}} {# 1 #}
--{{p.text}}
{% cache 600 p p.timestamp %}
{% for img in p.images.all %} {# 2 #}
--{{img.path}}
{% endfor %}
{% endcache %}
{% endfor %}
您向模板提供“帖子”;这是一个查询,您已经说过它有100个结果
然后,对于POST上的每次迭代,您都会在{1}
处点击数据库以获取p.by,我假设它是auth.User的外键
除此之外,如果缓存无效(第一次运行),您将在{2}
再次点击数据库以获取该帖子的图像列表
因此,对于100个项目,对于初始运行,每个请求都会命中数据库201次,对于映像循环,每次命中101次,缓存已满
如果可能的话,试着使用with your posts查询在一个查询中提取这些额外的结果。类似于
posts=Post.objects.select_related('by','images').filter(…)
可能会起作用,但我知道select_related
在反转外键和m2m字段时有限制(可能不适用于图像,具体取决于您的模型结构)。在开发模式下,django做了很多事情来简化开发(例如:重新加载代码;如果使用模板,则为每个请求呈现模板;…)
在生产模式中,在首选django之前部署WSGI服务器。这样的wsgi可能是
典型的生产web服务器布局可能是:nginx->gunicorn->django
一个简单的比较(django官方教程代码,带有一个非常简单的“Hello World!@time”模板):
生产方式
与gunicorn一起跑步
../bin/gunicorn-w4 mysite.wsgi#有4名工人
运行apacheab进行测试
ab-n1000-c10
什么是“慢”?80个请求/秒是慢的。因为如果没有几个memcache,我什么都不会做。不是答案,而是建议。你有没有尝试过像这里这样的缓存:是的,但是没有太大的区别。这是因为它可以节省模板解析的时间,而我在模板渲染方面很慢,但到底什么是“慢”?哪一行?我已经在查询未缓存时使用了select_related,但正如我所说,在本例中,我只是从memcached中提取结果。-是的,调试工具栏显示0个执行的查询。另外,我说它有10个结果,而不是100个。你在评论中说的是“100个循环”;我认为你在问题中提到的10是指内部图像循环在每篇文章中运行10次。对不起,如果我误解了。不,对不起,那是ipython shell的timeit命令。我用它来测试模板渲染的速度。(它在循环中重复表达式并选择最佳时间)
{% block content %}
<p> Hello World! @ {{ now }}</p>
{% endblock %}
Server Software: WSGIServer/0.2 # django
Server Hostname: 127.0.0.1
Server Port: 8000
Document Path: /polls/helloworld
Document Length: 59 bytes
Concurrency Level: 10
Time taken for tests: 3.438 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 242000 bytes
HTML transferred: 59000 bytes
Requests per second: 290.87 [#/sec] (mean)
Time per request: 34.380 [ms] (mean)
Time per request: 3.438 [ms] (mean, across all concurrent requests)
Transfer rate: 68.74 [Kbytes/sec] received
Server Software: gunicorn/19.7.1 # gunicorn
Server Hostname: 127.0.0.1
Server Port: 8000
Document Path: /polls/helloworld
Document Length: 59 bytes
Concurrency Level: 10
Time taken for tests: 0.618 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 248000 bytes
HTML transferred: 59000 bytes
Requests per second: 1619.10 [#/sec] (mean)
Time per request: 6.176 [ms] (mean)
Time per request: 0.618 [ms] (mean, across all concurrent requests)
Transfer rate: 392.13 [Kbytes/sec] received