赵走x博客
网站访问量:151571
首页
书籍
软件
工具
古诗词
搜索
登录
Python性能分析与优化:8、line_profiler
Python性能分析与优化:7、性能分析示例
Python性能分析与优化:6、性能分析器:cProfile
Python性能分析与优化:5、性能分析最佳实践
Python性能分析与优化:4、运行时间复杂度
Python性能分析与优化:3、内存消耗和内存泄漏、过早优化的风险
Python性能分析与优化:2、性能分析可以分析什么
Python性能分析与优化:3、内存消耗和内存泄漏、过早优化的风险
资源编号:75723
书籍
Python性能分析与优化
热度:102
软件开发过程中需要考虑的另一个重要资源是内存。一般的软件开发者不会意识到这一点,因为640KB RAM电脑的时代早已成为过去。但是一个内存泄漏的程序会把服务器糟蹋成640KB电脑。内存消耗不仅仅是关注程序使用了多少内存,还应该考虑控制程序使用内存的数量。
## **1.4 内存消耗和内存泄漏** 软件开发过程中需要考虑的另一个重要资源是内存。一般的软件开发者不会意识到这一点,因为640KB RAM电脑的时代早已成为过去。但是一个内存泄漏的程序会把服务器糟蹋成640KB电脑。内存消耗不仅仅是关注程序使用了多少内存,还应该考虑控制程序使用内存的数量。 有一些开发项目,比如嵌入式系统开发,就会要求开发者关注内存配置,因为这类系统的资源是相当有限的。但是,普通开发者总希望目标系统能够提供他们需要的RAM。 随着RAM和高级编程语言都开始支持自动内存管理(比如垃圾回收机制),开发者不需要关注内存优化了,系统会帮忙完成的。 跟踪程序内存的消耗情况比较简单。最基本的方法就是使用操作系统的任务管理器。它会显示很多信息,包括程序占用的内存数量或者占用总内存的百分比。任务管理器也是检查CPU时间使用情况的好工具。在下面的截图中,你会发现一个简单的Python程序(就是前面那段程序)几乎占用了全部CPU(99.8%),内存只用了0.1%。  用这样的工具(Linux系统在命令行用`top`命令),可以轻松检测内存泄漏问题,不过这也要根据程序的具体情况综合考虑。如果你的程序在持续加载数据,那么其内存消耗的比例,可能会与那些没有频繁使用外部资源的程序不同。 例如,如果我们把一个调用大量外部资源的程序的内存消耗随时间的变化描绘出来,可能如下图所示。  资源加载时,内存使用曲线出现高峰;资源释放时,曲线会下降。虽然程序的内存消耗变化有点儿大,但是我们可以统计没有加载资源时程序的内存消耗的平均值。只要确定了这个平均值(图中用矩形表示),就可以判断内存泄漏的情况。 让我们再看一个资源加载效果比较糟糕的程序的内存消耗图(没有完全释放资源)。  在上图中你会发现,每当资源不再使用时,占用的内存并没有完全释放,这时内存消耗曲线就会位于矩形之上。这就表示程序会消耗越来越多的内存,即使加载资源已经释放也是如此。 同理,也可以检测那些没有负载的程序的内存消耗情况,把执行特定任务的程序运行一段时间。有了数据,就很容易检测内存消耗和内存泄漏情况了。 让我们来看一个例子:  当运行过程启动之后,内存消耗会在一个范围内不断增加。如果发现增幅超出范围,而且消耗增大之后一直没有回落,就可以判断出现内存泄漏了。 一个内存泄漏的例子如下图所示。  ## **1.5 过早优化的风险** 优化通常被认为是一个好习惯。但是,如果一味优化反而违背了软件的设计原则就不好了。在开始开发一个新软件时,开发者经常犯的错误就是过早优化(permature optimization)。 如果过早优化代码,结果可能会和原来的代码截然不同。它可能只是完整解决方案的一部分,还可能包含因优化驱动的设计决策而导致的错误。 一条经验法则是,如果你还没有对代码做过测量(性能分析),优化往往不是个好主意。首先,应该集中精力完成代码,然后通过性能分析发现真正的性能瓶颈,最后对代码进行优化。