Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django非常慢_Python_Django_Django Templates - Fatal编程技术网

Python django非常慢

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}}

一些评测显示模板呈现是罪魁祸首。(我正在尝试只包含缓存查询的页面。) 但是,模板仍然非常简单。 最复杂的部分是运行10次的嵌套循环,但是如果一切顺利,嵌套循环就不会运行,因为它是缓存的。(就像在我的测试中)

就是

{% 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