python之性能优化
时间:2008-10-11 来源:pascal4123
Python 是一种解释性语言并不表示你不应该担心代码优化。但也不必太担心。
代码优化是否必要
由于代码优化过程中存在太多的不明确因素,以至于你很难清楚该从何入手。
让我们从这里开始:你真的确信你要这样做吗? 你的代码真的那么差吗?值得花时间去优化它吗?在你的应用程序的生命周期中,与花费在等待一个远程数据库服务器,或是等待用户输入相比,运行这段代码将花费多少时间?
第二,你确信已经完成代码编写了吗? 过早的优化就像是在一块半生不熟的蛋糕上撒糖霜。你花费了几小时、几天(或更长) 时间来优化你的代码以提高性能,却发现它不能完成你希望它做的工作。那是浪费时间。
这并不是说代码优化毫无用处,但是你需要检查一下整个系统,并且确定把时间花在这上面是值得的。在优化代码上每花费一分钟,就意味着你少了增加新功能、编写文档或者陪你的孩子玩或者编写单元测试的一分钟。
哦,是的,单元测试。不必我说,在开始性能优化之前你需要一个完全的单元测试集。你需要的最后一件事情就是在乱动你的算法时引入新的问题。
谨记着这些忠告。
使用timeit模块
你需要知道的最重要问题是,决不要自己编写计时函数。为一个很短的代码计时都很复杂。
Python 具备一个叫做 timeit 的完美计时工具。
import timeit
t=timeit.Timer("soundex.soundex('xyz')", "import soundex") //导入语句以及计时语句
t.timeit(n) //运行n次的耗时,缺省是100万次
t.repeat(3, 200000) //每次测试运行200000次,运行3次测试的耗时
优化正则表达式
就检查一个字符串而言,正则表达式几乎永远不是最好的答案,而且应该被尽可能避开。 这不仅仅是基于性能考虑,而是因为差错和维护都很困难,当然性能也是个原因。
优化字典查找
优化列表操作
优化字符串操作
小结
我希望你有很好的见解:性能并不是一切。 你在优化方面的努力应该与程序的可读性和可维护性相平衡。
- 如果你要在正则表达式和编写循环间抉择,选择正则表达式。 正则表达式因其是以 C 语言编译的可以本能地在你的计算机上运行,你的循环却以 Python 编写需要通过 Python 解释器运行。
- 如果你需要在正则表达式和字符串方法间抉择,选择字符串方法。 它们都是以 C 编译的,所以选取简单的。
- 字典查找的通常应用很快,但是 string.maketrans 之类的特殊函数和 isalpha() 之类的字符串方法更快。如果 Python 有定制方法给你用,就使它吧!
- 别太聪明了。 有时一些明显的算法是最快的。
- 不要太迷恋性能优化,性能并不是一切。