Python 性能优化 -- Loops

Python 性能优化 -- Loops

以下内容翻译自: http://wiki.python.org/moin/PythonSpeed/PerformanceTips

 

Loops

Python 支持多种的遍历方式。for 语句是最常用到的。当循环体很简单的时候,可以使用 map function 来替代。你可以认为 map function 的效率和 c 一样高。唯一的限制是 "loop body" of map 是 function call. List comprehension 除了在语法上看起来更简洁外,效率上等同甚至超过 map.

例子:

 

newlist = []
for word in oldlist:
     newlist.append(word.upper())

 

使用 map 从而使 interpreter 将遍历部分转换成 compiled C 代码。

 

newlist = map(str.upper, oldlist)
 

Python 2.0 加入了 list comprehension。这是一种更加高效、简洁的 for 结构替代品。

newlist = [s.upper() for s in oldlist]

 

Python 2.4 引入了 generator expression. Generator expression 功能上类似于 list comprehension 和 map, 但是避免了生成整个列表.取而代之的是,返回一个 generator object which can be iterated over bit-by-bit.

(我的实验结果是: 在20万数据完全遍历的情况下 List comprehension 大概是 generator expression 效率的 10 倍)

newlist = (s.upper() for s in oldlist)

# detail
>>> oldlist = ['a', 'b', 'c']
>>> newlist = [s.upper() for s in oldlist]
>>> print newlist
['A', 'B', 'C']
>>> newlist = (s.upper() for s in oldlist)
>>> print newlist
<generator object <genexpr> at 0x01DEB968>
>>> for item in newlist:
...     print item
...
A
B
C
>>>
# end of detail

 

Guido van Rossum 写过一篇更加详尽的关于 loop 优化的 examination (Python Patterns - An Optimization Anecdote: http://www.python.org/doc/essays/list2str.html).


避免使用‘.’ (Avoiding dots...)


也 许你更倾向于使用 for loop, 而不是 map 或者 list comprehension. 但是 for loop 有其低效的一面.  Both newlist.append and word.upper are function references that are reevaluated each time through the loop. 所以, 原始的 loop 可以用以下代码替代:

upper = str.upper
newlist = []
append = newlist.append
for word in oldlist:
     append(upper(world))

 

使用这个技巧需谨慎。当 loop 结构很复杂的时候,这会变得难以阅读和维护。采用一目了然的变量名是一个折中的办法。

你可能感兴趣的:(数据结构,C++,c,python,C#)