django 如何优化?

2021-01-18 16:23:54 +08:00
 lixuda

先说说使用感觉: 小白用户,之前用 flask,后面发现需要太多自己实现功能,改成 django,开发功能速度马上提升。 没有数据对比,只能使用的感觉 flask 比 django 响应快点,只能是一种感觉。 另外偶然性出现读取数据库时间过长,反复测试,就是偶发性。

所以问问高手们,具体使用过程中 django 该如何优化?

  1. value value_list 方式能否加快数据读取? 如:Model.objects.values_list('key','key1').filter(id=id).all()[:10]
  2. 关闭 USE_I18N 能有多少提升?
  3. ORM 使用上有什么好的技巧?
  4. 哪些配置可以关闭如 MIDDLEWARE
  5. 有没有好的目录结构推荐
  6. 有没有更多优化?
2953 次点击
所在节点    Python
13 条回复
wuwukai007
2021-01-18 17:00:18 +08:00
把 csrf 关了,速度立马提升
XiaoxiaoPu
2021-01-18 17:16:09 +08:00
ORM 查询优化可以看看 www.jianshu.com/p/aded5b2029f6
不过第一步是先精确定位到慢在哪
charexcalibur
2021-01-18 17:29:59 +08:00
空了可以看看官方的优化建议 https://docs.djangoproject.com/en/3.1/topics/performance/
reorx
2021-01-18 17:49:17 +08:00
1. 可以,values / values_list 相当于只 select 了指定的 fields ;如果需要得到 model instance 可以用 only / defer
2. 初次启动代码加载的提升,不影响 view 的处理时间
4. 了解每个具体的作用,视情况关闭,极端情况下都可以关闭
5. 可以看下我自己常用的脚手架项目,暂时还没有文档说明,与 django 官方教程的不同在于,只有一个 app,但会有多个 modules 中存在 models,通过自定义 AppConfig 完成加载 https://github.com/reorx/django_starter_pack/tree/master/starter_app
lixuda
2021-01-18 18:09:01 +08:00
zachlhb
2021-01-18 18:14:13 +08:00
use_i18n 不建议关闭,队列框架用的是 utc 时间的,关了队列的时间就会有大坑
reorx
2021-01-18 18:47:02 +08:00
@lixuda 不好意思,忘了改项目的可见性,现在好了
allisone
2021-01-18 18:58:01 +08:00
django 就是上手快
lixuda
2021-01-18 19:27:31 +08:00
@reorx 可以了,非常感谢。另外看见可以外部程序引用 django model 的 orm ?之前定时程序,用 peewee 来做,如果能直接用 app 里面 model 就方便多了
reorx
2021-01-19 00:28:14 +08:00
@lixuda 可以在外部程序中引用 django orm,需要在 import models 之前完成 `django.setup()`, 我封装了一个简单的函数 `setup_django` 专门用来执行这个操作,见文件 `utils/django_setup.py`.

示例见 `cli.py`: https://github.com/reorx/django_starter_pack/blob/master/cli.py
erakayin
2021-01-19 10:12:34 +08:00
nonduality
2021-01-19 12:01:51 +08:00
官网的教程很详细了,按照那个去做速度就能提升很多,基本上是:
0 、首先用 django debug tools 检查到底慢在哪,这个工具还是挺好用的;其次打开 context_processors 里头的 debug,再打开日志 django 里头的 log_level 为 debug,这样数据库每次访问的 sql 语句和次数都会打印出来,方便进行优化;
1 、对数据库使用 prefetch,用 only 或 defer 获取只需要的字段,数据库写入可以使用 update_fields 只更新特定字段; values_list 是能提升读取速度,但用起来不算太方便;
2 、对网页片段或生成的 json 缓存(配合 Redis 或 DiskCache 做后端都行);
3 、取消不必要的 middleware,比如不需要在模板用 Message,可以把它取消;还有 context_processors 里头 request 跟 auth 是重复的,仅方便你用 request 对象,你不需要可以取消 request,需要时再传入模板;
4 、生成 csrf key 确实很慢,如果不需要可以关掉;
5 、针对特定 view,对其算法进行优化,比方我有需要频繁合成一个特定时间,后来优化成用时间戳去算,就快了很多。
tmackan
2021-01-19 15:26:28 +08:00
先优化你的业务逻辑 /业务流程
profile 找到耗时的 func,然后想办法优化掉
另外 ORM 必须打印出 SQL 语句还要自己分析,是否合理
py 的 orm 中默认大量是用 select * 的查询,无法走索引覆盖,需要回表。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/745973

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX