python性能优化摘录 分类: python 2013-01-17 18:01 1192人阅读 评论(0) 收藏

字符串

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

1. 在字符串连接的使用尽量使用 join() 而不是 +;

2. 当对字符串可以使用正则表达式或者内置函数来处理的时候,选择内置函数。如 str.isalpha(),str.isdigit(),str.startswith(('x', 'yz')),str.endswith(('x', 'yz'));

3. 对字符进行格式化比直接串联读取要快,因此要在字符串与其他变量连接时就使用格式化字符串.请查看下面的连接形式:

name="Andre" 
print "Hello " + name 
print "Hello %s" % name

显然与第一个语句相比,第二个print语句更加优化.第三行中的括号是不需要的。



使用内建函数

你可以用Python写出高效的代码,但很难击败内建函数. 经查证. 他们非常快速.

clip_image004


使用join()连接字符串

你可以使用 "+" 来连接字符串. 但由于string在Python中是不可变的,每一个"+"操作都会创建一个新的字符串并复制旧内容. 常见用法是使用Python的数组模块单个的修改字符;当完成的时候,使用 join() 函数创建最终字符串.

>>> #This is good to glue a large number of strings 
>>> for chunk in input(): 
>>> my_string.join(chunk)

使用Python多重赋值,交换变量

在Python中即优雅又快速: 
>>> x, y = y, x 
这样很慢: 
>>> temp = x 
>>> x = y 
>>> y = temp

尽量使用局部变量

Python 检索局部变量比检索全局变量快. 这意味着,避免 "global" 关键字.

尽量使用 "in"

使用 "in" 关键字. 简洁而快速.

>>> for key in sequence: 
>>> print “found”

为无限循环使用 "while 1"

有时候在程序中你需一个无限循环.(例如一个监听套接字的实例) 尽管 "while true" 能完成同样的事, 但 "while 1" 是单步运算. 这招能提高你的Python性能.

使用 Lazy if-evaluation 的特性

Python 中条件表达式是 lazy evaluation 的,也就是说如果存在条件表达式 if x and y,在 x 为 false 的情况下 y 表达式的值将不再计算。因此可以利用该特性在一定程度上提高程序效率。

使用list comprehension和generator expression

从Python 2.0 开始,你可以使用 list comprehension 取代大量的 "for" 和 "while" 块. 使用List comprehension通常更快,Python解析器能在循环中发现它是一个可预测的模式而被优化.额外好处是,list comprehension更具可读性(函数式编程),并在大多数情况下,它可以节省一个额外的计数变量。列表解析要比在循环中重新构建一个新的 list 更为高效,因此我们可以利用这一特性来提高运行的效率。例如,让我们计算1到10之间的偶数个数:

>>> # the good way to iterate a range 
>>> evens = [ i for i in range(10) if i%2 == 0] 
>>> [0, 2, 4, 6, 8] 
>>> # the following is not so Pythonic 
>>> i = 0 
>>> evens = [] 
>>> while i < 10: 
>>> if i %2 == 0: evens.append(i) 
>>> i += 1 
>>> [0, 2, 4, 6, 8]

生成器表达式则是在 2.4 中引入的新内容,语法和列表解析类似,但是在大数据量处理时,生成器表达式的优势较为明显,它并不创建一个列表,只是返回一个生成器,因此效率较高。例如:代码 a = [w for w in list] 修改为 a = (w for w in list),运行时间进一步减少,缩短约为 2.98s。



posted @ 2013-01-17 18:01  前行者2011  阅读(113)  评论(0编辑  收藏  举报