Python高性能技巧
数据结构使用技巧
列表
在列表中检查是否存在某个值远比字典和集合速度慢,因为Python是线性搜索列表中的值,但在字典和集合中,在同样的时间内还可以检查其它项(基于哈希表)。
append vs insert
与append相比,insert耗费的计算量大,因为对后续元素的引用必须在内部迁移,以便为新元素提供空间。
如果要在序列的头部和尾部插入元素,你可能需要使用collections.deque,一个双尾部队列。
串联和组合
通过加法将列表串联的计算量较大,因为要新建一个列表,并且要复制对象。用extend追加元素,尤其是到一个大列表中,更为可取。
bisect
如果列表项很多,且需要保持排序,更高效.
bisect模块支持二分查找,和向已排序的列表插入值。
前提: 列表已排序.即对未排序的列表使用bisect不会产生错误,但结果不一定正确.
性能小贴士
- 把重复操作作为参数放到循环进行是非常低效的。应该提取成一个新变量。
- 字符串连接符+比较低效,应该用格式化操作符%,或把字符串放到列表然后join()
工具
- Py-Spy:Python 进程取样分析工具
- VMProf Profiler
- SnakeViz: An in-browser Python profile viewer
- line_profile
- Memory Profiler
- vprof: 可视化profiler
- gperftools : Google Performance Tools
- pdb++