Python性能分析与优化

早在写博客源码的时候就加上了 『读书』 一栏,但是一直没有写关于书评的文章。一个原因是最近比较忙,另外一个原因是有的书看了过后感觉收获不是很大,只有特定一些章节感觉自己有所见识和收获,其它的就是看了就忘了。后面偶然接触到了Xmind,感觉到它的强大和实用之处,我把它用来做读书笔记,感觉效果很不错。Xmind免费的功能对于我来说就已经够用了,如果大家有更多的需求,那么请购买Xmind Pro吧,这也是对原作者的一种支持,听说他还是一名中国人!


『Python性能分析与优化』一书,听书名就很清晰,讲的就是关于Python语言的性能分析和优化。性能分析主要是借助可视化工具进行分析,辅以CProfile,书中讲的性能分析工具是pyprof2calltree+KCacheGrind,这个只能在Linux环境下运行。在Windows环境下有另外一款可视化性能分析工具Snakeviz,它会把函数的运行情况以Html的形式展示出来。

性能分析之后就是性能优化,这是一个永恒的话题,书中讲了一些常用的优化方法。下面我具体讲讲。

细节优化

  • 使用函数返回值缓存结果,函数返回值一般为字典或者列表。这种写法在之前我阅读低版本Requests源码的视乎看到过,现在才明白为何要这么写。
  • 使用默认参数代替位置参数
  • 使用生成器创建长列表,使用列表生成式创建短列表
  • 使用ctypes

常用优化方法

  • PyPy。不过这货只支持Python2.x进行优化,而且必须是纯Python代码
  • Cython。使用Cython需要先将.pyx文件编译成.c文件,然后再将.c文件编译成.so文件

多线程和多进程

  • IO密集型:可以使用多线程,GIL造成的影响忽略不计
  • 计算密集型: 使用多进程。多进程创建的开销比线程要大。另外,使用多进程需要考虑进程间通信,而使用多线程可能需要考虑线程的资源竞争和线程同步等问题
  • 书中还有一点没有讲到,就是使用异步来代替同步的方案,Python对异步的支持也很完善,异步IO是多线程的一个更合适的代替方案,因为它是单线程,所以不会有创建和销毁线程的开销,也不存在多线程的同步、竞态等问题

数据处理

  • Numba:它支持直接把Python代码转化为机器码,甚至可以直接转化为CPU、GPU能够运行的代码,所以速度很快
  • Pandas:它可以将大数据文件载入内存或者保存为其它形式,用它来处理大文件十分方便。它还可以与matplotlib轻松整合,做数据可视化工作。它是使用Cython编写的,所以速度也很快
  • Parakeet:它可以轻松处理数值计算的问题,但是支持的数据类型有限,包括Python的数字、元组、列表和Numpy的数组。除此之外,它也不支持异常捕获和处理。

大概内容就是这些,我在读的时候画了更详细的思维导图,有兴趣的可以看看:查看


我在github上专门为此开了一个项目,欢迎大家围观,觉得有帮助不防给个star