django 如何优化? - V2EX
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 3541 次点击
    这是一个创建于 1725 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说说使用感觉: 小白用户,之前用 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/tpics/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     Solana     919 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 20:08 PVG 04:08 LAX 13:08 JFK 16:08
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86