龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > python编程 >

深入理解Python 代码优化详解(2)

时间:2014-10-28 02:27来源:网络整理 作者:网络 点击:
分享到:
改为 set 后程序的运行时间缩减为 8.75,提高了 4 倍多,运行时间大大缩短。读者可以自行使用表 1 其他的操作进行测试。 表 1. set 常见用法 语法 操作 说

  改为 set 后程序的运行时间缩减为 8.75,提高了 4 倍多,运行时间大大缩短。读者可以自行使用表 1 其他的操作进行测试。
 
  表 1. set 常见用法

语法 操作 说明
set(list1) | set(list2) union 包含 list1 和 list2 所有数据的新集合
set(list1) & set(list2) intersection 包含 list1 和 list2 中共同元素的新集合
set(list1) – set(list2) difference 在 list1 中出现但不在 list2 中出现的元素的集合

  对循环的优化
 
  对循环的优化所遵循的原则是尽量减少循环过程中的计算量,有多重循环的尽量将内层的计算提到上一层。 下面通过实例来对比循环优化后所带来的性能的提高。程序清单 4 中,如果不进行循环优化,其大概的运行时间约为 132.375。
 
  清单 4. 为进行循环优化前

复制代码 代码如下:

from time import time
 t = time()
 lista = [1,2,3,4,5,6,7,8,9,10]
 listb =[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.01]
 for i in range (1000000):
     for a in range(len(lista)):
         for b in range(len(listb)):
             x=lista[a]+listb[b]
 print "total run time:"
 print time()-t

  现在进行如下优化,将长度计算提到循环外,range 用 xrange 代替,同时将第三层的计算 lista[a] 提到循环的第二层。
 
  清单 5. 循环优化后

复制代码 代码如下:

from time import time
 t = time()
 lista = [1,2,3,4,5,6,7,8,9,10]
 listb =[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.01]
 len1=len(lista)
 len2=len(listb)
 for i in xrange (1000000):
     for a in xrange(len1):
         temp=lista[a]
         for b in xrange(len2):
             x=temp+listb[b]
 print "total run time:"
 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 的特性

复制代码 代码如下:

from time import time
 t = time()
 abbreviations = ['cf.', 'e.g.', 'ex.', 'etc.', 'fig.', 'i.e.', 'Mr.', 'vs.']
 for i in range (1000000):
     for w in ('Mr.', 'Hat', 'is', 'chasing', 'the', 'black', 'cat', '.'):
         if w in abbreviations:
         #if w[-1] == '.' and w in abbreviations:
             pass
 print "total run time:"
 print time()-t

  在未进行优化之前程序的运行时间大概为 8.84,如果使用注释行代替第一个 if,运行的时间大概为 6.17。
 
  字符串的优化
 
  python 中的字符串对象是不可改变的,因此对任何字符串的操作如拼接,修改等都将产生一个新的字符串对象,而不是基于原字符串,因此这种持续的 copy 会在一定程度上影响 python 的性能。对字符串的优化也是改善性能的一个重要的方面,特别是在处理文本较多的情况下。字符串的优化主要集中在以下几个方面:
 1.在字符串连接的使用尽量使用 join() 而不是 +:在代码清单 7 中使用 + 进行字符串连接大概需要 0.125 s,而使用 join 缩短为 0.016s。因此在字符的操作上 join 比 + 要快,因此要尽量使用 join 而不是 +。
 
  清单 7. 使用 join 而不是 + 连接字符串

精彩图集

赞助商链接