更有效的方法来解决这个例子?

时间:2013-07-10 18:59:46

标签: python performance

我正在从LearnPython.org学习Python并且遇到了这个例子:

  

问:打印re中所有功能的按字母顺序排序的列表   模块,包含单词find。

输出应如下所示:['findall', 'finditer']

以下是我提出的建议:

import re
function_list = []
for function_name in dir(re):
    if "find" in function_name:
        function_list.append(function_name)
print function_list

是否有更有效/更有效的解决方法?

2 个答案:

答案 0 :(得分:7)

import re
function_list = [f for f in dir(re) if 'find' in f] # faster than using list.append
function_list.sort() # faster than using sorted. This can actually be excluded, since `dir` returns a sorted list

列表推导通常比附加到列表更快。虽然我不确定为什么(我喜欢有人在这里讨论),但我觉得这可能是因为它允许口译员事先分配;而使用list.append可能会使解释器处于必须将整个列表复制到内存中的新位置的状态。这是因为python列表在C中实现为动态数组,需要一个连续的内存块。

此外,您可能倾向于使用sorted,它使用与list.sort相同的算法,但有一个非常重要的区别。 list.sort就地(即修改列表本身),而sorted创建并返回一个新列表。这里使用就地操作的优点是最终节省了复制项目时用于创建新列表的时间。

答案 1 :(得分:0)

import re
print re.findall('([^,]*find[^,]+)', ','.join(dir(re)))