代码性能优化
优化是对代码进行等价变换,使得变换后的代码运行结果与变换前的代码运行结果相同,但执行速度加快或存储开销减少。
- 代码性能优化是一门复杂的学问。
- 根据 80/20 原则,实现程序的重构、优化、扩展以及文档相关的事情通常需要消耗80% 的工作量。
- 在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率
- 以提高程序的全局效率为主,提高局部效率为辅
- 在优化程序效率时,应先找出限制效率的“瓶颈”
- 先优化数据结构和算法,再优化执行代码
- 时间效率和空间效率可能是对立的,应当分析哪一个因素更重要,再做出适当的折衷
- 从一开始就要考虑程序性能,不要期待在开发结束后再做一些快速调整
- 正确的代码要比速度快的代码重要,任何优化都不能破坏代码的正确性
- 认真选择测试数据,使其能够代表实际的使用状况
- 永远不要在没有执行前后性能评估的情况下尝试对代码进行优化
性能测试工具
Profile是Python语言内置的性能分析工具,它能够有效地描述程序运行的性能状况,提供各种统计数据帮助程序员找出程序中的性能瓶颈。
案例:原因分析
为什么 keys() 函数的调用复杂度过高?
keys(): Return a new view of the dic5onary’s keys(docs.python.org)
- 原因:每调用一次keys()函数,系统就会生成一个新的字典迭代器,如果这个生成过程重复50万次,…...
- 优化:使用 in 操作符直接代替keys(),不再每次生成新的迭代器。
案例:优化结果
- 性能优化的关键是如何发现问题,寻找解决问题的方法。
- 有效的测试是不可缺少的,通过测试找出真正的瓶颈,并分析优化结果
- 要避免不必要的优化,避免不成熟的优化,不成熟的优化是错误的来源
Python 代码性能优化
改进算法,选择合适的数据结构
- 良好的算法对性能起到关键作用,因此性能改进的首要点是对算法改进
- 算法时间复杂性的排序依次是
- 对成员的查找访问等操作,字典(dictionary)要比列表(list)更快
- 集合(set)的并、交、差的操作比列表(list)的迭代要快
循环优化的基本原则:尽量减少循环过程中的计算量,在多重循环的时候,尽量将内层的计算提到上一层。
字符串的优化: Python的字符串对象是不可改变的。字符串连接的使用尽量使用 join() 而不是 +。当对字符串可以使用正则表达式或者内置函数处理时,选择内置函数。
使用列表解析和生成器表达式:列表解析要比在循环中重新构建一个新的list 更为高效,因此可以利用这一特性来提高运行的效率。