如何让 Django API 再快一点 (2)
0X00 前言
啊,这个破系统怎么这么慢。 -你写的程序的用户
是的我写过一篇类似的博客,但是一篇肯定说不完,毕竟影响性能的东西太多了:数据量巨大、机器配置差、查询SQL效率低、额外的多余的查询、低质量的代码balabala的。今天这篇文章主要是从Django查询和ORM层面来分析一下API变慢的原因。
啊,这个破系统怎么这么慢。 -你写的程序的用户
是的我写过一篇类似的博客,但是一篇肯定说不完,毕竟影响性能的东西太多了:数据量巨大、机器配置差、查询SQL效率低、额外的多余的查询、低质量的代码balabala的。今天这篇文章主要是从Django查询和ORM层面来分析一下API变慢的原因。
Python管filter/map/reduce这些叫高阶函数,听起来有点高级有点难搞的意思,实际上是贼简单的东西。下面通过几个简单的例子来帮助大家了解一下filter/map/reduce这三个高阶函数的简单用法。
尽管去做 (英语:Getting Things Done / GTD ),是一种行为管理的方法,也是戴维·艾伦写的一本书的书名。
GTD的主要原则在于一个人需要通过记录的方式把头脑中的各种任务移出来。通过这样的方式,头脑可以不用塞满各种需要完成的事情,而集中精力在正在完成的事情。
啊,这个破系统怎么这么慢。 –你写的程序的用户
是的,我用Django写的程序经常会出现性能问题,有时候是逻辑问题、有时候是数据库问题、有时候又是机器问题。我就现在这儿总结一波我自己的经验好了(这里都是基于我自己的经验来的,可能会相对比较简单,没有太骚太复杂太高级的东西)。这儿默认大家都是用的Django + Django REST framework了,因为我自己是用的这套技术栈,而且这套技术栈也算是Django生态下前后端分离的最常见的了。
本来我也是一个从来不记读书笔记的人,总觉得张无忌师傅的那个"都忘了吗?忘了就去吧"的神奇教诲很有道理,我也是一直都是看书看多少算多少,记住的就记住了,忘了也就忘了。即使这次开始记笔记也不是因为我要把看过的内容都记住,这完全不可能。
Linux诡异的权限是怎么回事呢?Linux相信大家都很熟悉, 但是诡异的权限是怎么回事呢?下面就让小编带大家一起了解吧。
Linux诡异的权限,其实就是诡异的权限了。那么Linux为什么会诡异的权限,相信大家都很好奇是怎么回事。大家可能会感到很惊讶,Linux怎么会诡异的权限呢?但事实就是这样,小编也感到非常惊讶。 那么这就是关于Linux诡异的权限的事情了,大家有没有觉得很神奇呢?
这篇博客要配合发在bilibili的视频来看,这个文件是在~/.zshrc的。大家有问题直接在视频下面留言或者直接给我私信好了~
2020年要来了,听起来这是个多科幻的年号啊。《银翼杀手》里说2019年底人类就有强人工智能了,可以穿梭宇宙了,甚至可以星际殖民了。然而现在就是2019年最后一天了,我的小爱同学还是像智障一样经常听不懂我说话。
自从用起docker之后,每次在自己本地开发环境部署新服务就首选用docker了。虽然理论上docker跟裸机部署比起来多多少少有一些缺点,但是跟3分钟部署几乎一些开发环境服务的优势比起来简直都是毛毛雨了。
使用django-admin startproject test_project创建一个新的Django项目之后在settings.py中可以找到一个配置项ROOT_URLCONF,默认情况下值为项目目录下的urls,也就是test_project.urls。
Python中对象的概念都快被大家淡忘了,因为一切都是对象(话虽然这么说,但是怎么可能淡忘对象呢)。看下面一段Python2的代码,Python2中麻烦的就是这个super()的用法。
在使用docker部署之前,一般都是直接将MySQL和Redis这类服务直接安装在机器上的。以至于好多新手才开始安装使用的时候经常会出问题,出了问题解决不了就重装系统然后再重装软件,而且如果想同时用MySQL5和MySQL8就非常麻烦了。话说回来,在生产环境服务器上其实还是很多直装的服务的,不过其实使用docker部署一套相同的环境是非常有利于自己本地开发的。
多线程和多进程在平时编程中是挺常见的操作,不过控制进程和线程的数量是一件比较麻烦的事情。尤其是线程,之前在搜索到的关于线程池的内容多数都是“造轮子”,实际上Python已经给我们造好了这个轮子。文档在这里,甚至还是中文的https://docs.python.org/zh-cn/3.7/library/concurrent.futures.html#module-concurrent.futures
实话讲,Django的信号(signal)机制其实用到的时候并不多,但是某些特定场景下一个信号能解决非常大的问题,所以信号这个东西还是值得了解一下的。那么为什么这里只说一些初级内容呢,主要是因为通过调查发现信号的高级知识用(我)的(也)很(不)少(会)。
众所周知计算机的IO都要比计算慢很多很多,即时是目前民用的高级SSD:三星970PRO,它的读写速度都要比内存慢上几个数量级,更不要说CPU了。所以软件的IO通常都是瓶颈,很多时候都是CPU等内存,内存等磁盘,磁盘等网络。
这篇博客的目标读者:正在使用Linux桌面,打算长期继续使用下去的同学(这也就意味着熟悉Linux下的基础操作,理解Linux下的常见概念)。
这篇博客的目标读者:有Linux使用基础,打算使用Linux作为桌面系统的人(这也就意味着熟悉Linux下的基础操作,理解Linux下的常见概念)。
众所周知Dockerfile是构建Docker镜像的优良方式,而使用Dockerfile构建镜像最重要的就是为数不多的几个命令,而本次的主题COPY和ADD就是其中两个。我们知道这两个命令都是将文件搞到Docker镜像里用的,那究竟有没有区别,有什么区别呢?
使用过MySQL或者类似的数据库都应该知道,一个数据库内部是可以分成多个库的。比如MySQL从上到下是MySQL service -> database -> table -> field,但是一开始使用redis的时候好像是没有database这一层的呢?其实是存在这么一层的,redis默认是存在编号0到15这总共16个库的,每个库除了命名空间不同以外都是相同的。也就是说在编号为0的库里set name shawn之后跑到编号为1的库里get name是拿不到的。
构建Docker镜像的方式并不多,最常用的也就只有:编写Dockerfile和使用docker commit这两种。既然方式分为两种那么肯定是有区别的(废话),那我们来看看吧。