V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lixuda
V2EX  ›  Python

django 如何优化?

  •  
  •   lixuda · 2021-01-18 16:23:54 +08:00 · 2924 次点击
    这是一个创建于 1165 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说说使用感觉: 小白用户,之前用 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. 有没有更多优化?
    13 条回复    2021-01-19 15:26:28 +08:00
    wuwukai007
        1
    wuwukai007  
       2021-01-18 17:00:18 +08:00   ❤️ 1
    把 csrf 关了,速度立马提升
    XiaoxiaoPu
        2
    XiaoxiaoPu  
       2021-01-18 17:16:09 +08:00   ❤️ 1
    ORM 查询优化可以看看 www.jianshu.com/p/aded5b2029f6
    不过第一步是先精确定位到慢在哪
    charexcalibur
        3
    charexcalibur  
       2021-01-18 17:29:59 +08:00
    空了可以看看官方的优化建议 https://docs.djangoproject.com/en/3.1/topics/performance/
    reorx
        4
    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
        5
    lixuda  
    OP
       2021-01-18 18:09:01 +08:00
    zachlhb
        6
    zachlhb  
       2021-01-18 18:14:13 +08:00 via Android
    use_i18n 不建议关闭,队列框架用的是 utc 时间的,关了队列的时间就会有大坑
    reorx
        7
    reorx  
       2021-01-18 18:47:02 +08:00
    @lixuda 不好意思,忘了改项目的可见性,现在好了
    allisone
        8
    allisone  
       2021-01-18 18:58:01 +08:00
    django 就是上手快
    lixuda
        9
    lixuda  
    OP
       2021-01-18 19:27:31 +08:00
    @reorx 可以了,非常感谢。另外看见可以外部程序引用 django model 的 orm ?之前定时程序,用 peewee 来做,如果能直接用 app 里面 model 就方便多了
    reorx
        10
    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
        11
    erakayin  
       2021-01-19 10:12:34 +08:00
    nonduality
        12
    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
        13
    tmackan  
       2021-01-19 15:26:28 +08:00
    先优化你的业务逻辑 /业务流程
    profile 找到耗时的 func,然后想办法优化掉
    另外 ORM 必须打印出 SQL 语句还要自己分析,是否合理
    py 的 orm 中默认大量是用 select * 的查询,无法走索引覆盖,需要回表。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   963 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:35 · PVG 04:35 · LAX 13:35 · JFK 16:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.