django性能优化

1. 内存、内存,仍是加内存php

2. 使用单独的静态文件服务器html

3. 关闭KeepAlive(若是服务器不提供静态文件服务,如:大文件下载)python

4. 使用memcachedgit

5. 使用select_related()加载关联表数据程序员

6. 使用values()过滤没必要要的字段查询github

7. 使用模板cache数据库

8. 加载编译的模板django

9.让Django支持数据库长链接 能够提升很多性能缓存

 

from django.template import loader
from django.http import HttpResponse
#loads and compiles the template
myview_template = loader.get_template('path/to/template.html')
def myview(request):
    # do sth¡ 
    return HttpResponse(myview_template.render( context ))

 

而不是直接用 render_to_response服务器

 程序员都喜欢去的地方:http://www.lailu8.com

Django数据层提供各类途径优化数据的访问,一个项目大量优化工做通常是放在后期来作,早期的优化是“万恶之源”,这是前人总结的经验,不无道理。若是事先理解Django的优化技巧,开发过程当中稍稍留意,后期会省很多的工做量。

一 利用标准数据库优化技术:

传统数据库优化技术博大精深,不一样的数据库有不一样的优化技巧,但重心仍是有规则的。在这里算是题外话,挑两点通用的说说:

索引,给关键的字段添加索引,性能能更上一层楼,如给表的关联字段,搜索频率高的字段加上索引等。Django创建实体的时候,支持给字段添加索引,具体参考Django.db.models.Field.db_index。按照经验,Django创建实体以前应该早想好表的结构,尽可能想到后面的扩展性,避免后面的表的结构变得面目全非。

使用适当字段类型,原本varchar就搞定的字段,就别要text类型,小细节别不关紧要,后头数据量一上去,几亿几亿的数据,小字段极可能是大问题。


二 了解Django的QuerySets:

了解Django的QuerySets对象,对优化简单程序有相当重要的做用。QuerySets是有缓存的,一旦取出来,它就会在内存里呆上一段时间,尽可能重用它。举个简单的例子:

了解缓存属性:
>>> entry = Entry.objects.get(id=1)
>>> entry.blog   # 博客实体第一次取出,是要访问数据库的
>>> entry.blog   # 第二次再用,那它就是缓存里的实体了,再也不访问数据库


但下面的例子就不同,
>>> entry = Entry.objects.get(id=1)

>>> entry.authors.all()   # 第一次all函数会查询数据库

>>> entry.authors.all()   # 第二次all函数还会查询数据库

all,count exists是调用函数(须要链接数据库处理结果的),注意在模板template里的代码,模板里不容许括号,但若是使用此类的调用函数,同样去链接数据库的,能用缓存的数据就别链接到数据库去处理结果。还要注意的是,自定义的实体属性,若是调用函数的,记得本身加上缓存策略。

利用好模板的with标签:
模板中屡次使用的变量,要用with标签,把它当作变量的缓存行为吧。

使用QuerySets的iterator():
一般QuerySets先调用iterator再缓存起来,当获取大量的实体列表而仅使用一次时,缓存行为会耗费宝贵的内存,这时iterator()能帮到你,iterator()只调用iterator而省去了缓存步骤,显著减小内存占用率,具体参考相关文档。


三 数据库的工做就交给数据库自己计算,别用Python处理:

1 使用 filter and exclude 过滤不须要的记录,这两个是最经常使用语句,至关是SQL的where。

2 同一实体里使用F()表达式过滤其余字段。

3 使用annotate对数据库作聚合运算。

不要用python语言对以上类型数据过滤筛选,一样的结果,python处理复杂度要高,并且效率不高, 白白浪费内存。

使用QuerySet.extra():
extra虽然扩展性不太好,但功能很强大,若是实体里须要须要增长额外属性,不得已时,经过extra来实现,也是个好办法。

使用原生的SQL语句:
若是发现Django的ORM已经实现不了你的需求,而extra也无济于事的时候,那就用原生SQL语句吧,用Djangoango.db.connection.queries去实现你须要的东西。


四 若是须要就一次性取出你所须要的数据:

单一动做(如:同一个页面)须要屡次链接数据库时,最好一次性取出全部须要的数据,减小链接数据库次数。此类需求推荐使用QuerySet.select_related() 和 prefetch_related()。

相反,别取出你不须要的东西,模版templates里每每只须要实体的某几个字段而不是所有,这时QuerySet.values() 和 values_list(),对你有用,它们只取你须要的字段,返回字典dict和列表list类型的东西,在模版里够用便可,这可减小内存损耗,提升性能。

一样QuerySet.defer()和only()对提升性能也有很大的帮助,一个实体里可能有很多的字段,有些字段包含不少元数据,好比博客的正文,不少字符组成,Django获取实体时(取出实体过程当中会进行一些python类型转换工做),咱们能够延迟大量元数据字段的处理,只处理须要的关键字段,这时QuerySet.defer()就派上用场了,在函数里传入须要延时处理的字段便可;而only()和defer()是相反功能。

使用QuerySet.count()代替len(queryset),虽然这两个处理得出的结果是同样的,但前者性能优秀不少。同理判断记录存在时,QuerySet.exists()比if queryset实在强得太多了。

固然同样的结果,在缓存里已经存在,就别滥用count(),exists(),all()函数了。


五 懂减小数据库的链接数:

使用 QuerySet.update() 和 delete(),这两个函数是能批处理多条记录的,适当使用它们事半功倍;若是能够,别一条条数据去update delete处理。

对于一次性取出来的关联记录,获取外键的时候,直接取关联表的属性,而不是取关联属性,如:

entry.blog.id

优于

entry.blog_id


善于使用批量插入记录,如:
Entry.objects.bulk_create([
    Entry(headline="Python 3.0 Released"),
    Entry(headline="Python 3.1 Planned")
])
优于
Entry.objects.create(headline="Python 3.0 Released")
Entry.objects.create(headline="Python 3.1 Planned")
前者只链接一次数据库,然后者链接两次哦。

还有类似的动做须要注意的,如:多对多的关系,
my_band.members.add(me, my_friend)
优于
my_band.members.add(me)
my_band.members.add(my_friend)

为何,批量处理的角度本身琢磨一下。

 

0、  在配置中使用相对路径

某些缘由使得项目可能经常会被来回的迁移。若是没有事先规划好这种可能性的话这绝对是一个棘手的问题。Rob Hudson 有一个极好的技巧可以确保你的Django项目在部署过程当中可以轻松的来回迁移。仅仅只要编写几行代码在你的配置文件(settings.py)中。

1
2
3
4
5
6
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
 
TEMPLATE_DIRS = (
     BASE_DIR + '/templates' ,
)

 

一、  使用{%url%}标签

尽量使用向后兼容的{%url%}标签来替换硬编码形式的href,与使用绝对路径的url(固然最好不要这样作) 同样达到相同的效果。你的Django项目迁移起来,那些连接也不会有影响。(译者注:好比说咱们有一个views.about函数指向about页面r’^about/$’,就能够{% url views.about as about_url %}而后用{{about_url}}这个变量来代替绝对URL地址)尽管它还不是最高级的技巧,可是它确实值得你应用于Django项目中。

 Photo by Cloudzilla.

 

二、  尝试把Django admin应用到PHP项目中

Django最伟大的特性之一就是已经成为Django的核心功能的用户验证系统。它易安装,主要用于用户认证和其它一些必要的配置。这个酷毙了的用户系统甚至被建议应用到你的PHP项目中去,这里有一边Jeff Croft 关于为何Django可以做为任何语言任何应用中的系统管理模块的一个很好的解决方案。

 

三、  使用独立的媒体服务器

在开发环境中把静态文件放在与Django项目所在的同一台服务器中问题并不大,可是却不要使用在生产环境中,为何?效率问题。Jacobian.org给出了一个合理的解释。经过一台独立的服务器来处理静态文件,性能将获得有效的提高,若是不想买服务器的话,那么使用Amazon S3相对来更便宜。

 

四、  使用Debugger工具条

调试工具对任何一种语言来讲都是不可或缺的.他们可以加快开发的速度,指出潜在的缺陷.  Rob Hudson开发了一个对开发人员很是有用django调试工具

 

五、 使用Django单元测试

利用单元测试确保你代码的改变和预期的同样,而不会破坏任何老的代码,以便向后兼容。Django一个强大的特性就是他能极其简单地写单元测试。Django也可直接使用python的文本测试单元测试。Django的文档提供了一个详细的教程和样例代码关于怎样作单元测试使得代码正确地运行,以及去除讨厌的bug

 

六、 使用速查卡

这里有两页厚的速查卡,在 Django文档中你可能翻来覆去要找半天的东西在这里一目了然。它包含以下几个主题

模板:

模板标签及可选项

模板过滤器及可选项

日期格式化语法快速查阅

模型:

域和及选项

经常使用域的可选项

元类型可选项

模型管理可选项

表单:

域和可选项

经常使用域可选项

标准错误消息键值

 

七、使用Django-chunks

除了使用Django的富文本编辑器建立块更容易以外,Django-chunks一样是用于模板中,这是重用代码块的必不可少的工具。

 

八、 使用Memcache

若是性能在你的Django项目中已经成为一个棘手的问题,那么你将须要使用一些缓存策略。然而Django为缓存提供不少的选择。目前最好的无疑是Memcache,用Django安装memcache很是地简单,若是你使用cmemcache模块的时候。只要模块安装完成后,你仅仅修改一行配置项,你的Django页面变得轻快起来。

 

九、使用Django,心动不如行动

在你阅读完这篇文章后若是你仍然不彻底理解Django的强大,在你的下一个项目中使用Django的一个合符情理的理由就是:它可以节省各类不一样软件设计的时间。Jeff Croft解释为何用Django建立一个项目比你本身设计出来的更高效。Django容许你扩展本身的Web站点,不须要担忧设计或者代码以及数据库的兼容性,它会工做地很棒。

相关文章
相关标签/搜索