python笔记-python编程优化:常用原则和技术介绍
2015-09-21 19:19
651 查看
本人翻译自《Exper Python Programming》
'Premature optimization is the root of all evil in programming' -Donald Knuth
优化的三原则
让它跑起来先
一个非常常见的错误就是在编写代码之初我们就开始对代码进行优化。让人伤心的是这通常做的都是无用功,很多软件只有你跑起来了才会发现它真正的瓶颈在哪里。
站在用户的视角看问题
曾经有一个团队为了自己的项目跑起来更快加班加点最终达到了自己满意的效果,最终交付到客户那里,结果发现客户并不觉得跑得快对他有什么好处。。。
始终保持代码可读(可维护)
如果当你已经完成了90%的优化任务,而剩下10%的优化任务可能会使你的代码完全的不可读,那这个时候你最好可以停止你的优化工作了。
优化的策略
去找别人的问题
通常情况下我们的软件测试不可能做到100%的模拟真实环境。当客户向我们抱怨软件运行速度不如从前时,我们不妨找找是不是因为在和别的应用进行交互时候,其他应用造成的速度问题。
刷硬件
这个大家都好懂,跑的慢?先看看是不是你配置不够啊,不够就买买买!
编写一个速度测试文档
当我们开始优化工作的时候,我们不妨在我们的目标函数下面写一条注释“该函数运行时间不能超过1秒”
寻找瓶颈
查看CPU使用率
从CPU的角度来看呢,又分为宏观查找和微观查找。这里最常用的是cProfile,它是一个c语言的库,提供对程序资源使用的监控还有时间的记录。具体的使用方法可以点这里。
查看内存使用率
既然说的是python,我们也就不得不提到python的内存分配机制,不像c语言那样,我们可以使用一个函数就知道当前变量的内存分配情况,而在python中我们是绝不会知道某个变量当前分配了多少内存空间的。。通常情况下,消耗内存空间的原因有:1.某个变量不受控制的增长;2.在全局有太多的实例,而且没有监控他们对内存的使用;3.没有正确关闭的线程;4.有__del__属性的对象在一个循环体内
具体的内存检测工具有:Guppy、Heapy
查看网络使用率
这一部分的话我们使用通用的网络监测工具就好了。
降低代码复杂度
两个维度:
测量分支复杂度:程序中ifelse语句的分支有多少
测量时间空间复杂度
最后两个大主题是:多线程和缓存。这两个方法也是非常重要的优化程序的方法,先写到这里,看完继续更。
'Premature optimization is the root of all evil in programming' -Donald Knuth
优化的三原则
让它跑起来先
一个非常常见的错误就是在编写代码之初我们就开始对代码进行优化。让人伤心的是这通常做的都是无用功,很多软件只有你跑起来了才会发现它真正的瓶颈在哪里。
站在用户的视角看问题
曾经有一个团队为了自己的项目跑起来更快加班加点最终达到了自己满意的效果,最终交付到客户那里,结果发现客户并不觉得跑得快对他有什么好处。。。
始终保持代码可读(可维护)
如果当你已经完成了90%的优化任务,而剩下10%的优化任务可能会使你的代码完全的不可读,那这个时候你最好可以停止你的优化工作了。
优化的策略
去找别人的问题
通常情况下我们的软件测试不可能做到100%的模拟真实环境。当客户向我们抱怨软件运行速度不如从前时,我们不妨找找是不是因为在和别的应用进行交互时候,其他应用造成的速度问题。
刷硬件
这个大家都好懂,跑的慢?先看看是不是你配置不够啊,不够就买买买!
编写一个速度测试文档
当我们开始优化工作的时候,我们不妨在我们的目标函数下面写一条注释“该函数运行时间不能超过1秒”
寻找瓶颈
查看CPU使用率
从CPU的角度来看呢,又分为宏观查找和微观查找。这里最常用的是cProfile,它是一个c语言的库,提供对程序资源使用的监控还有时间的记录。具体的使用方法可以点这里。
查看内存使用率
既然说的是python,我们也就不得不提到python的内存分配机制,不像c语言那样,我们可以使用一个函数就知道当前变量的内存分配情况,而在python中我们是绝不会知道某个变量当前分配了多少内存空间的。。通常情况下,消耗内存空间的原因有:1.某个变量不受控制的增长;2.在全局有太多的实例,而且没有监控他们对内存的使用;3.没有正确关闭的线程;4.有__del__属性的对象在一个循环体内
具体的内存检测工具有:Guppy、Heapy
查看网络使用率
这一部分的话我们使用通用的网络监测工具就好了。
降低代码复杂度
两个维度:
测量分支复杂度:程序中ifelse语句的分支有多少
测量时间空间复杂度
最后两个大主题是:多线程和缓存。这两个方法也是非常重要的优化程序的方法,先写到这里,看完继续更。
相关文章推荐
- python 与 webdriver结合打开不同浏览器
- Python学习之路——django(一)
- Top K问题用Python求解
- Python异常处理和异常类型
- python 时间
- windows下搭建python cgi编程环境
- python中翻转字符串的方法,标记一下
- 零基础学python-18.9 序列映射函数:map
- 零基础学python-18.9 序列映射函数:map
- cmd中运行python文件,并带参数
- Python 16进制与字符串的转换
- python正则表达式匹配邮箱
- python 实现重启路由器
- 计划看一本英文版的Python基础教程
- kNN算法python代码学习2-手写识别系统
- python启动浏览器崩溃
- 【干货】前方高能!如何保障Python应用的高性能
- Python list(列表)实践
- Autorun a python script after reboot using rc.local
- 小甲鱼Python笔记(类)