0X00 前言
啊,这个破系统怎么这么慢。 -你写的程序的用户
是的我写过一篇类似的博客,但是一篇肯定说不完,毕竟影响性能的东西太多了:数据量巨大、机器配置差、查询SQL效率低、额外的多余的查询、低质量的代码balabala的。今天这篇文章主要是从Django查询和ORM层面来分析一下API变慢的原因。
其中可能性比较多,我这里先挑几个我经常遇到的情况来说:不管自己的需求直接查询所有字段、完全不在意索引、疯狂使用in、循环创建/更新数据、不善于使用缓存。这几个问题其实都会对我们的API响应速度造成比较大的影响,下面我们来一个个介绍一下。
0X01 SELECT *
首先我们一定知道,从数据库里查询的数据越多那反应也就越慢。我这里拿一个只有500条数据的表来展示一下,这里可以看到两次的耗时虽然都很短(那可不嘛,就500条数据),但是比例上还是差了三倍还多,如果随着数据量变大和字段变多这个差距就会更加明显。但是我们可以看到在循环里只需要name这个字段,多余的是用不到的。
实际上这两个查询执行的是不同的两个SQL(当然了这是废话),那具体区别呢?可以看到一个是SELECT *…
0X00 前言 & Pythonic
Python管filter/map/reduce这些叫高阶函数,听起来有点高级有点难搞的意思,实际上是贼简单的东西。下面通过几个简单的例子来帮助大家了解一下filter/map/reduce这三个高阶函数的简单用法。
事先声明,这三个函数都是扩展性质的东西,从来不用这三个函数也可以正常的编写程序,没有什么功能是没了这三个函数就写不出来的。只不过是这三个函数的出现能让之前很丑陋的代码变得精简易读了而已。
这三个函数非常适合搭配lambda来使用,编写非常Pythonic的代码,具体什么是Pythonic其实很难定义,其实就是把Python编程一个形容词了,比如你看到一个人“穿了运动鞋牛仔裤帽衫双肩包黑框眼镜电子表”就会说他“太程序员了”,大概就是这么个意思。总结来说呢就是 非常具有Python特色的Python代码 。比如下面这段代码明显就不Pythonic
而这种代码就是Pythonic的写法
尤其是结合了lambda之后,就能写出更Pythonic的代码了,例如
就可以直接用lambda改写成这个样子
0X01 filter…
0X00 GTD
尽管去做 (英语:Getting Things Done / GTD ),是一种行为管理的方法,也是戴维·艾伦写的一本书的书名。
GTD的主要原则在于一个人需要通过记录的方式把头脑中的各种任务移出来。通过这样的方式,头脑可以不用塞满各种需要完成的事情,而集中精力在正在完成的事情。
--维基百科
GTD说白了就是把自己要做的事项从脑子里拿出来,写到纸上或者记到什么鬼地方,我最喜欢的就是"滴答清单"了。
最早的时候我用的是Google日历,在学校里的时候这样用了一两年还不错。后来大四出来实习,那段时间工作哪儿哪儿都不顺利,也就没心情安排自己的生活和学习了,所以实习的那一年基本就是下班了就趴在床上玩手机,什么都没干成。不只是没学习,而是没玩游戏没看电影,实打实的什么都没干成。后面又重拾了GTD,把自己安排的明明白白的,对我来说效果还是立竿见影的。我安排自己不只是学习,也包括社交和娱乐,约好什么时间和谁在哪儿吃饭或者干嘛的;自己给自己规定什么时间玩游戏,给自己规定什么时间看电影。…
0X00 前言
啊,这个破系统怎么这么慢。 --你写的程序的用户
是的,我用Django写的程序经常会出现性能问题,有时候是逻辑问题、有时候是数据库问题、有时候又是机器问题。我就现在这儿总结一波我自己的经验好了(这里都是基于我自己的经验来的,可能会相对比较简单,没有太骚太复杂太高级的东西)。这儿默认大家都是用的Django + Django REST framework了,因为我自己是用的这套技术栈,而且这套技术栈也算是Django生态下前后端分离的最常见的了。
0X01 问题出在哪儿呢
众所周知"想要解决问题,首先就要找到问题在哪儿"。那怎么判断问题在哪儿呢?
1. 首先登到服务器上看htop,有面有一个Load…
0X00 为什么要记读书笔记
本来我也是一个从来不记读书笔记的人,总觉得张无忌师傅的那个"都忘了吗?忘了就去吧"的神奇教诲很有道理,我也是一直都是看书看多少算多少,记住的就记住了,忘了也就忘了。即使这次开始记笔记也不是因为我要把看过的内容都记住,这完全不可能。
那到底是什么原因让我开始记读书笔记了呢?"走神"。没错,就是走神。我看书的时候,尤其是自己没有那么大兴趣的书,我经常机械的读着书然后思路就飞到不知道哪里去了,可能是其他相关的知识、可能是海拉鲁大陆、可能是九界湖、也可能幻想着自己去悬崖边上的麦田里抓那些快要掉到悬崖下的小孩儿了。
所以为了让自己不再继续走神下去,我决定做点什么。最开始的时候是尝试把自己看到的一切内容都真正的"读"出来,读出声来,但是后来发现这种方式不太适合我,每次一本正经得把书里的内容一个字一个字念出来都觉得很奇怪,像是小学生在上语文课一样。放弃读出声来的操作之后就想到了记笔记,目前看起来这种方案还是不错的。
0X01 我平时怎么记…
0X00 前言
Linux诡异的权限是怎么回事呢?Linux相信大家都很熟悉, 但是诡异的权限是怎么回事呢?下面就让小编带大家一起了解吧。
Linux诡异的权限,其实就是诡异的权限了。那么Linux为什么会诡异的权限,相信大家都很好奇是怎么回事。大家可能会感到很惊讶,Linux怎么会诡异的权限呢?但事实就是这样,小编也感到非常惊讶。 那么这就是关于Linux诡异的权限的事情了,大家有没有觉得很神奇呢?
看了今天的内容,大家有什么想法呢?欢迎在评论区告诉小编一起讨论哦。
说正事说正事儿。说起Linux权限大家肯定:"这我知道啊,不就是rwx吗,r是读、w是写、x是执行。就这?"当然不只是这个,不过我们还是要从最基础的开始说起来。
0X01 基础权限部分
首先最基础的权限就是 rwx 这种,三组权限针对:所 属用户、所属用户的组、其他用户,每组3位(对应 二进制位)。正因为对应二进制位所以rwx就是三个 二进制位均为1的7;r-x就是对应的101也就是5;r- 就是100也就是4
最基础的rwx权限就不多说了,说一个不是所有人都 知道的,看下面这张截图:这个叫做linux.pdf的文…
0X00 视频在这里 下面是配置文件
这篇博客要配合发在bilibili的视频来看,这个文件是在~/.zshrc的。大家有问题直接在视频下面留言或者直接给我私信好了~
0X00 前言
2020年要来了,听起来这是个多科幻的年号啊。《银翼杀手》里说2019年底人类就有强人工智能了,可以穿梭宇宙了,甚至可以星际殖民了。然而现在就是2019年最后一天了,我的小爱同学还是像智障一样经常听不懂我说话。
换个角度想一想,90后是不是会觉得60后已经算是老年人了;那么相同时间差算下来20后也会觉得我们90后是老人,然而第一个20后还有一个多小时就出生了呢。
0X01 2019年度分析
2019年是我第一次做整年的规划,大概进度是这样的。正所谓“取法其上,仅得其中;取法其中,仅得其下”,所以给自己的目标定高一些甚至超出自己的能力也没什么不好的,这样可以让自己完成目标的动力最大化的嘛(其实也算是给自己没完成目标找一个借口,哈哈哈)。
阅读20本书【完成】
专业进阶(学习了解新技术)【5/7】
了解五个新领域【4/5】
撰写30篇博客(包含20篇技术类)【27/30】
观看50部电影(包含25部豆瓣top250)【47/50】
减重至75KG(共减10KG)【5/10】…
0X00 使用docker部署RabbitMQ
自从用起docker之后,每次在自己本地开发环境部署新服务就首选用docker了。虽然理论上docker跟裸机部署比起来多多少少有一些缺点,但是跟3分钟部署几乎一些开发环境服务的优势比起来简直都是毛毛雨了。
首先要拉个镜像下来,通常拉镜像都是选择最新的或者特定某个版本,但是RabbitMQ有一点比较奇怪,如果逆向拉带有web管理页面的就不能用latest,而应该选择management。然后确定好镜像之后再了解一下端口情况,RabbitMQ带有web管理页面的话会用到两个端口:提供MQ服务的5672和提供web服务的15672。
下面是我的配置文件,把内容保存为docker-compose.yml然后docker-compose up -d就好了(如果不在yml文件所在目录下执行或者文件名不叫docker-compose.yml的话要用docker-compose -f xxx/xxx/xxx/xxx.yml指定配置文件的位置。…
0X00 url的源头
使用django-admin startproject test_project创建一个新的Django项目之后在settings.py中可以找到一个配置项ROOT_URLCONF,默认情况下值为项目目录下的urls,也就是test_project.urls。
默认情况下这个urls.py的内容大致是这样的
这里就是根目录了,新项目使用python manage.py runserver启动之后访问http://127.0.0.1:8000/就是访问到这个url的根路由了,默认情况下有一个admin/可选,也就是Django自己的后台管理页面。Django所有的url都是从这个文件发散出去的 ,urlpatterns里除了将url路由至view就是其他的子url配置。换句话说,通常情况下Django中所有url最终都应该被路由到View上才对。
0X01 路由到子url和view…