浅谈提高Django性能
Django性能优化是一件困难的事情,但是也不常常如此:
下面4步将能够轻松的提高你的网站的性能,它们非常简单你应该将它们
作为标配。
持久化数据库连接
django1.6以后已经内置了数据库持久化连接,很多人使用PostgreSQL作为它们的线上数据库系统,而当我们连接PostgreSQL有时会显得很慢,这里我们可以进行优化。
没有持久化连接,每一个网站的请求都会与数据库建立一个连接。如果数据库不在本地,尽管网速很快,这也将花费20-75ms.
设置持久化连接,仅需要添加CONN_MAX_AGE参数到你的数据库设置中:
DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.postgresql_psycopg2’,
‘NAME’: ‘whoohoodb’,
‘CONN_MAX_AGE’: 600,
}
}
通过这样的设置,我们设置的持久化连接每次都将存活10分钟
这有助于减少内存泄漏或导致一种片状连接的问题。
你可设置更长的时间,但是我不要设置超过1个小时,因为这样获得的效果不会太好。你可以从django的帮助文档中获取详细信息 django持久化连接
模版加载
默认django使用两个标准的模版加载器
TEMPLATE_LOADERS = (
‘django.template.loaders.filesystem.Loader’,
‘django.template.loaders.app_directories.Loader’,
每一个请求,这些模版加载器都会去文件系统搜索,然后解析这些模版。
这里可以感觉到,它是不是可以处理的更快了?
你可以开启缓存加载,因此django只会查找并且解析你的模版一次
配置如下:
TEMPLATE_LOADERS = (
(‘django.template.loaders.cached.Loader’, (
‘django.template.loaders.filesystem.Loader’,
‘django.template.loaders.app_directories.Loader’,
)),
)
但是,不要在开发环境中开启缓存加载,这样会很烦人的,因为每次模版做了修改之后你都需要重启服务才能看到修改后的效果
优化django会话
很多人不知道django的session的存储,django存储sessions在数据库中,并希望有时候能够清理掉一些不用了的,但是很少人会这么做。
这样的话每一个请求都要使用sql查询会话数据,然后获得用户对象的信息。
一些对性能比较关心的人,会使用memory cache或者redis来缓存一些东西,这样的话,你可以将你的会话放到缓存数据库中,因此轻松移除掉每一次请求都会去进行sql查询的所耗费的时间。
设置如下:
SESSION_ENGINE = ‘django.contrib.sessions.backends.cache’
前面假设你可以丢失任何存储的会话,如果不是那样的话,像下面这样配置:
SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db’
这里,后台会缓存数据,并同时会把修改的内容写入到数据库中长期保存
select_related() 和 prefetch_related()
相比于修改数据库存储,这里只要需要简单的设置select_related()和prefetch_related(),在使用ORM的情况下,他能够减少sql查询的数量。
这里有一个BlogPost模型,它有一个用户外键,获得了一个listview
queryset = BlogPost.objects.active
那么在模版中是这样使用:
<ul>
{% for post in object_list %}
<li>{{ post.title }} - {{ post.user.email }}</li>
{% endfor %}
</ul>
这里满足了预期的效果,但是每个post都会去查询auth_user表。为了解决这个问题,可以让djangode的ORM在前面就连接上auth_user 表,这样object.user就是一个可以直接用的对象了,这样BlogPost.objects.active().count()就会变成一个简单的查询
修改如下:
queryset = BlogPost.objects.select_related().active()
prefetch_related的机理是相同的
当感到疑惑时,开启django调试工具,然后分析每次请求的查询次数和时间,如果每次查询都要用上5~10次,那么这些就是可以优化的线索
浅谈提高Django性能的更多相关文章
- 浅谈Android应用性能之内存
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 文/ jaunty [博主导读]在Android开发中,不免会遇到许多OOM现象,一方面可能是由于开 ...
- [原创]浅谈H5页面性能优化方法
[原创]浅谈H5页面性能优化方法 前阶段公司H5页面性能测试,其中测试时也发现了一些性能瓶颈问题,接下来我们在来谈谈H5页面性能优化,仅仅是一些常用H5页面性能优化措施,其实和Web页面性能优化思路大 ...
- 浅谈webpack4.0 性能优化(转)
前言:在现实项目中,我们可能很少需要从头开始去配置一个webpack 项目,特别是webpack4.0发布以后,零配置启动一个项目成为一种标配.正因为零配置的webpack对项目本身提供的“打包”和“ ...
- BizTalk开发系列(三十二)浅谈BizTalk主机性能优化
很多BizTalk的项目都要考虑到性能优化的问题,虽然BizTalk采用多线程处理消息的,大大提高了程序效率.但默认情况下 BizTalk的主机有很多阻止参数会控制BizTalk对服务器的资源使用率, ...
- 浅谈MySQL 数据库性能优化
MySQL数据库是 IO 密集型的程序,和其他数据库一样,主要功能就是数据的持久化以及数据的管理工作.本文侧重通过优化MySQL 数据库缓存参数如查询缓存,表缓存,日志缓存,索引缓存,innodb缓存 ...
- 浅谈web前端性能优化
前端性能优化: 一.尽可能减少前端http请求. 1.合并优化脚本文件和css文件. 2.同种类型的背景图片尽量放在一起,用css控制显示. 二.使用浏览器缓存. 如果能强制浏览器缓存在本地,将会降低 ...
- 浅谈Python Django框架
1.Django简介 Python下有多款不同的 Web 框架,Django是最有代表性的一种.许多成功的网站和APP都基于Django. Django是一个开源的Web应用框架,由Python写成. ...
- 浅谈Oracle数据库性能优化的目标
Oracle性能优化保证了Oracle数据库的健壮性,为了保证Oracle数据库运行在最佳的性能状态下,在信息系统开发之前就应该考虑数据库的优化策略.从数据库性能优化的场景来区分,可以将性能优化分为如 ...
- 浅谈Vue 项目性能优化 经验
我优化公司的项目总结的几点: 1.先查看引入的图片大小,如果太大了,可以压缩,压缩路径:https://zhitu.isux.us/ 2.代码包优化, 待下项目开发完成.进行打包源码上线环节,需要对项 ...
随机推荐
- Django 数据表更改
Django 数据表更改 « Django 开发内容管理系统(第四天) Django 后台 » 我们设计数据库的时候,早期设计完后,后期会发现不完善,要对数据表进行更改,这时候就要用到本节的知识. D ...
- 一步步教你轻松学KNN模型算法
一步步教你轻松学KNN模型算法( 白宁超 2018年7月24日08:52:16 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用.本文通过一个模拟的实际案例进行讲解. ...
- GitHub删除已有仓库
之前都只是创建,还没试过删除,讲道理,如果第一次找删除按钮,还是有点小曲折的,特记录如下: 1.先找到你要删除的仓库 2.点进去,到具体项目地址,找到setting 3.点进去,一直往下翻,会看到红色 ...
- IsDebuggerPresent原理及其 c++实现
在IsDebuggerPresent下断,步入得到如下代码: 75 A1 | ] | eax:std::cout 75 | ] | eax:std::cout 75 | ] | eax:std::co ...
- 《深度探索C++对象模型》调用虚函数
如果一个类有虚函数,那么这个类的虚函数会被放在一个虚函数表里面, 使用这个类声明的对象中,会有一个指向虚函数表的指针,当使用指向 这个对象的指针或者这个对象的引用调用一个虚函数的时候,就会从虚函数表中 ...
- 【C#】解析C#中LING的使用
LING提供了一种从数据源中获取数据的方式,不同的语言已经形成了很多种关联的数据源.LING(Language Integrated Query,语言集成查询)提供一种通用的从不同的数据源中获取数据的 ...
- 简单理解 RPC(转载)
原文地址:http://www.syyong.com/architecture/Simple-understanding-of-RPC.html RPC(Remote Procedure Call P ...
- c# 基于redis分布式锁
在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量. 而同步的本质是通过锁来实现的.为了实现多个线程在 ...
- 【Unity/Kinect】手势识别Gesture
在Unity的AssetStore官方商店下载Kinect v2 Examples案例包,参考KinectDemos/GestureDemo这个文件夹下的例子. 自定义一个类,实现KinectGest ...
- 交换上的FLAPPING事件 (zhuan)
今天在学校的一个三层交换上看到持续的日志信息: Host 00:E0:FC:09:BC:F9is flapping between fa0/x and fa0/y. 思科对此官方的解释是: Error ...