Shawn's Blog

一个伪程序员的伪技术博客

0X00 前言

啊,这个破系统怎么这么慢。 -你写的程序的用户

是的我写过一篇类似的博客,但是一篇肯定说不完,毕竟影响性能的东西太多了:数据量巨大、机器配置差、查询SQL效率低、额外的多余的查询、低质量的代码balabala的。今天这篇文章主要是从Django查询和ORM层面来分析一下API变慢的原因。

其中可能性比较多,我这里先挑几个我经常遇到的情况来说:不管自己的需求直接查询所有字段、完全不在意索引、疯狂使用in、循环创建/更新数据、不善于使用缓存。这几个问题其实都会对我们的API响应速度造成比较大的影响,下面我们来一个个介绍一下。

阅读全文 »

0X00 前言 & Pythonic

Python管filter/map/reduce这些叫高阶函数,听起来有点高级有点难搞的意思,实际上是贼简单的东西。下面通过几个简单的例子来帮助大家了解一下filter/map/reduce这三个高阶函数的简单用法。

事先声明,这三个函数都是扩展性质的东西,从来不用这三个函数也可以正常的编写程序,没有什么功能是没了这三个函数就写不出来的。只不过是这三个函数的出现能让之前很丑陋的代码变得精简易读了而已。

这三个函数非常适合搭配lambda来使用,编写非常Pythonic的代码,具体什么是Pythonic其实很难定义,其实就是把Python编程一个形容词了,比如你看到一个人“穿了运动鞋牛仔裤帽衫双肩包黑框眼镜电子表”就会说他“太程序员了”,大概就是这么个意思。总结来说呢就是 非常具有Python特色的Python代码。比如下面这段代码明显就不Pythonic

1
2
for index in range(len(name_list)):
print(name_list[index])

而这种代码就是Pythonic的写法

1
2
for name in name_list:
print(name)

尤其是结合了lambda之后,就能写出更Pythonic的代码了,例如

1
2
3
4
5
def is_boy(student):
if student.gender == 'M':
return True
else:
return False

就可以直接用lambda改写成这个样子

1
is_boy = lambda studnet: student.gender == 'M'
阅读全文 »

0X00 GTD

尽管去做(英语:Getting Things Done / GTD),是一种行为管理的方法,也是戴维·艾伦写的一本书的书名。

GTD的主要原则在于一个人需要通过记录的方式把头脑中的各种任务移出来。通过这样的方式,头脑可以不用塞满各种需要完成的事情,而集中精力在正在完成的事情。

​ –维基百科

GTD说白了就是把自己要做的事项从脑子里拿出来,写到纸上或者记到什么鬼地方,我最喜欢的就是”滴答清单”了。

最早的时候我用的是Google日历,在学校里的时候这样用了一两年还不错。后来大四出来实习,那段时间工作哪儿哪儿都不顺利,也就没心情安排自己的生活和学习了,所以实习的那一年基本就是下班了就趴在床上玩手机,什么都没干成。不只是没学习,而是没玩游戏没看电影,实打实的什么都没干成。后面又重拾了GTD,把自己安排的明明白白的,对我来说效果还是立竿见影的。我安排自己不只是学习,也包括社交和娱乐,约好什么时间和谁在哪儿吃饭或者干嘛的;自己给自己规定什么时间玩游戏,给自己规定什么时间看电影。

这样一套流程下来,有两个明显的好处:自己的时间利用率极大的提升了,不会出现坐在桌子前面考虑接下来要干什么的事情;另一个就是方便自己回顾生活,毕竟不写日记的话自己也搞不清楚哪天哪天干了什么事儿了。这里给大家看一下我滴答清单里的任务分类:

这里主要是学习类、个人日常生活类、工作和年度规划。除了每年年底会对新一年进行规划以外,还会在每个月对下个月进行规划。不过正所谓”取法其上,仅得其中;取法其中,仅得其下”,所以也不要因为自己没有完成月内所有计划或者年度计划而自我否定,只要在没有突发事件的情况下都按部就班完成了自己的任务安排,那损失的那一点点跟全局比起来都是小问题了。

安排时间的时候有个问题需要注意:给自己一定的缓冲时间,比如整整一周不要尝试将周一至周五的晚上都安排上学习,然后周六周日又安排三四部电影和游戏时间。因为很大可能你周五晚上下班是要跟朋友约出去吃吃喝喝的,很大可能周末会被叫出去玩或者自己睡过了之类的。而且即使没有这些外在因素,也不应该给自己安排的满满当当的。我自己的建议是这样:周一到周四的晚上安排三次学习,空出来一天用来缓冲;周五晚上不安排,即使没有约也可以自己给自己放个假;周六周日给自己安排一天半的时间,而且然后周六晚上不安排学习,可以的话给周日晚上安排一波学习。

仅从我自己的角度来说,这类GTD方案让我非常受用,不仅时间变多了,也更有节奏了。自己知道周一到周四晚上不该玩游戏,周末又可以玩一整天。时间拍起来之后的生活里我玩到了很多以前觉得没时间玩的优秀游戏,比如战神 塞尔达 GTA5 和一众优秀游戏,也看了很多以前觉得没时间看的豆瓣Top250电影。

阅读全文 »

0X00 前言

啊,这个破系统怎么这么慢。 –你写的程序的用户

是的,我用Django写的程序经常会出现性能问题,有时候是逻辑问题、有时候是数据库问题、有时候又是机器问题。我就现在这儿总结一波我自己的经验好了(这里都是基于我自己的经验来的,可能会相对比较简单,没有太骚太复杂太高级的东西)。这儿默认大家都是用的Django + Django REST framework了,因为我自己是用的这套技术栈,而且这套技术栈也算是Django生态下前后端分离的最常见的了。

0X01 问题出在哪儿呢

众所周知”想要解决问题,首先就要找到问题在哪儿”。那怎么判断问题在哪儿呢?

htop截图

  1. 首先登到服务器上看htop,有面有一个Load average就是综合负载。一般来说,如果你的服务器是n核心的,那负载在n-2以下就算是正常的,快到n了也不是不能用,但是就要考虑升级了。这里给出来了三个负载值,从左到右依次是1分钟、5分钟、10分钟的负载情况。(为什么说是一般情况呢,如果你就只有一两个核心,那这个算法肯定不生效;如果你有128核,那负载到126了就意味着马上就炸🤣。所以说一半双核心不超过1.5、4核不超过3,8核不超过6这种)
  2. 如果确定了就是机器性能的问题,那就好办了,升级服务器就好(当然不是不够久升级,还是要觉得当前的数据量啊并发啊已经挺高了再考虑。要不然一慢就升级服务器,那岂不是太奢侈了,而且对自己的代码质量也没有一点好处)
  3. 我们假设不需要升级服务器配置,那就从程序和数据库两个方面来说。一般是先打开MySQL的慢查询日志,然后根据慢查询日志来逐渐优化表结构,优化查询,优化程序逻辑。
阅读全文 »

0X00 为什么要记读书笔记

本来我也是一个从来不记读书笔记的人,总觉得张无忌师傅的那个”都忘了吗?忘了就去吧”的神奇教诲很有道理,我也是一直都是看书看多少算多少,记住的就记住了,忘了也就忘了。即使这次开始记笔记也不是因为我要把看过的内容都记住,这完全不可能。

那到底是什么原因让我开始记读书笔记了呢?”走神”。没错,就是走神。我看书的时候,尤其是自己没有那么大兴趣的书,我经常机械的读着书然后思路就飞到不知道哪里去了,可能是其他相关的知识、可能是海拉鲁大陆、可能是九界湖、也可能幻想着自己去悬崖边上的麦田里抓那些快要掉到悬崖下的小孩儿了。

所以为了让自己不再继续走神下去,我决定做点什么。最开始的时候是尝试把自己看到的一切内容都真正的”读”出来,读出声来,但是后来发现这种方式不太适合我,每次一本正经得把书里的内容一个字一个字念出来都觉得很奇怪,像是小学生在上语文课一样。放弃读出声来的操作之后就想到了记笔记,目前看起来这种方案还是不错的。

0X01 我平时怎么记

我这里给出的方案只适用于跟我类似的朋友,如果你是认认真真读书然后想要整理大纲呀整理知识点呀之类的,那我的方案应该是帮不到你(不过也可以看看,万一呢)。我介绍的方案是我自己用过的,也就两种,很简单的。

首先是实体笔记,也就是像在学校里那样,左右各一本,一边看一边记;目前我是用iPad来统筹了看书和记笔记,也就放下了纸质笔记本和用了好几年的kindle(现在他可以去做他的专职工作:泡面 了)。我自己用电脑的时候不管显示器多大我都很少分屏,但是到了iPad上开个分屏一边是Kindle app一边是godnotes,效率还是挺高的(这里庆幸一下之前纠结过后还是买了iPad Air,要是当时选择了iPad mini的话分屏记笔记怕不是记笔记得累死个人)。这张图就是我平时记笔记的时候(不要在意好不好看。什么?你说看不懂?我的笔记是给自己看的,你看不看得懂问题不大🤣)

阅读全文 »
0%