Python 代码性能优化技巧(2)

来源:开源中国社区 作者:IBM/DW
  
02 t = time()
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]
05 len1=len(lista)
06 len2=len(listb)
07 for i in xrange (1000000):
08 for a in xrange(len1):
09 temp=lista[a]
10 for b in xrange(len2):
11 x=temp+listb[b]
12 print "total run time:"
13 print time()-t
上述优化后的程序其运行时间缩短为 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 的特性
01 from time import time
02 t = time()
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:
07 #if w[-1] == '.' and w in abbreviations:
08 pass
09 print "total run time:"
10 print time()-t
在未进行优化之前程序的运行时间大概为 8.84,如果使用注释行代替第一个 if,运行的时间大概为 6.17。

字符串的优化

python 中的字符串对象是不可改变的,因此对任何字符串的操作如拼接,修改等都将产生一个新的字符串对象,而不是基于原字符串,因此这种持续的 copy 会在一定程度上影响 python 的性能。对字符串的优化也是改善性能的一个重要的方面,特别是在处理文本较多的情况下。字符串的优化主要集中在以下几个方面:

  1. 在字符串连接的使用尽量使用 join() 而不是 +:在代码清单 7 中使用 + 进行字符串连接大概需要 0.125 s,而使用 join 缩短为 0.016s。因此在字符的操作上 join 比 + 要快,因此要尽量使用 join 而不是 +。

清单 7. 使用 join 而不是 + 连接字符串
01 from time import time
02  
03 t = time()
04 s = ""
05 list = ['a','b','b','d','e','f','g','h','i','j','k','l','m','n']
06 for i in range (10000):
07 for substr in list:
08 s+= substr
09 print "total run time:"
10 print time()-t
同时要避免:
1 s = ""
2 for x in list:
3 s += func(x)
而是要使用:
1 slist = [func(elt) for elt in somelist]
2 s = "".join(slist)
  1. 当对字符串可以使用正则表达式或者内置函数来处理的时候,选择内置函数。如 str.isalpha(),str.isdigit(),str.startswith(('x', 'yz')),str.endswith(('x', 'yz'))
  2. 对字符进行格式化比直接串联读取要快,因此要使用
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 更为高效,因此我们可以利用这一特性来提高运行的效率。

01 from time import time
02 t = time()
03 list = ['a','b','is','python','jason','hello','hill','with','phone','test',
04 'dfdf','apple','pddf','ind','basic','none','baecr','var','bana','dd','wrd']
05 total=[]
06 for i in range (1000000):
07 for w in list:
08 total.append(w)
09 print "total run time:"
10 print time()-t

使用列表解析:

1 for i in range (1000000):
2 a = [w for w in list]

时间:2012-07-30 07:46 来源:开源中国社区 作者:IBM/DW 原文链接

好文,顶一下
(0)
0%
文章真差,踩一下
(0)
0%
------分隔线----------------------------


把开源带在你的身边-精美linux小纪念品
无觅相关文章插件,快速提升流量