Python 代码性能优化技巧(2)
03 |
lista = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] |
04 |
listb = [ 0.1 , 0.2 , 0.3 , 0.4 , 0.5 , 0.6 , 0.7 , 0.8 , 0.9 , 0.01 ] |
07 |
for i in xrange ( 1000000 ): |
08 |
for a in xrange (len1): |
10 |
for b in xrange (len2): |
12 |
print "total run time:" |
上述优化后的程序其运行时间缩短为 102.171999931。在清单 4 中 lista[a] 被计算的次数为 1000000*10*10,而在优化后的代码中被计算的次数为 1000000*10,计算次数大幅度缩短,因此性能有所提升。
充分利用 Lazy if-evaluation 的特性
python 中条件表达式是 lazy evaluation 的,也就是说如果存在条件表达式 if x and y,在 x 为 false 的情况下 y 表达式的值将不再计算。因此可以利用该特性在一定程度上提高程序效率。
清单 6. 利用 Lazy if-evaluation 的特性
03 |
abbreviations = [ 'cf.' , 'e.g.' , 'ex.' , 'etc.' , 'fig.' , 'i.e.' , 'Mr.' , 'vs.' ] |
04 |
for i in range ( 1000000 ): |
05 |
for w in ( 'Mr.' , 'Hat' , 'is' , 'chasing' , 'the' , 'black' , 'cat' , '.' ): |
06 |
if w in abbreviations: |
09 |
print "total run time:" |
在未进行优化之前程序的运行时间大概为 8.84,如果使用注释行代替第一个 if,运行的时间大概为 6.17。
字符串的优化
python 中的字符串对象是不可改变的,因此对任何字符串的操作如拼接,修改等都将产生一个新的字符串对象,而不是基于原字符串,因此这种持续的 copy 会在一定程度上影响 python 的性能。对字符串的优化也是改善性能的一个重要的方面,特别是在处理文本较多的情况下。字符串的优化主要集中在以下几个方面:
- 在字符串连接的使用尽量使用 join() 而不是 +:在代码清单 7 中使用 + 进行字符串连接大概需要 0.125 s,而使用 join 缩短为 0.016s。因此在字符的操作上 join 比 + 要快,因此要尽量使用 join 而不是 +。
清单 7. 使用 join 而不是 + 连接字符串
05 |
list = [ 'a' , 'b' , 'b' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' ] |
06 |
for i in range ( 10000 ): |
09 |
print "total run time:" |
同时要避免:
而是要使用:
1 |
slist = [func(elt) for elt in somelist] |
- 当对字符串可以使用正则表达式或者内置函数来处理的时候,选择内置函数。如 str.isalpha(),str.isdigit(),str.startswith(('x', 'yz')),str.endswith(('x', 'yz'))
- 对字符进行格式化比直接串联读取要快,因此要使用
1 |
out = "<html>%s%s%s%s</html>" % (head, prologue, query, tail) |
而避免
1 |
out = "<html>" + head + prologue + query + tail + "</html>" |
使用列表解析(list comprehension)和生成器表达式(generator expression)
列表解析要比在循环中重新构建一个新的 list 更为高效,因此我们可以利用这一特性来提高运行的效率。
03 |
list = [ 'a' , 'b' , 'is' , 'python' , 'jason' , 'hello' , 'hill' , 'with' , 'phone' , 'test' , |
04 |
'dfdf' , 'apple' , 'pddf' , 'ind' , 'basic' , 'none' , 'baecr' , 'var' , 'bana' , 'dd' , 'wrd' ] |
06 |
for i in range ( 1000000 ): |
09 |
print "total run time:" |
使用列表解析:
1 |
for i in range ( 1000000 ): |
时间:2012-07-30 07:46
来源:开源中国社区
作者:IBM/DW
原文链接
------分隔线----------------------------