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写出高效的代码,但很难击败内建函数. 经查证. 他们非常快速.
使用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。