【问题标题】:More efficient way of solving this example?解决这个例子的更有效方法?
【发布时间】:2013-07-10 18:59:46
【问题描述】:

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

Q:打印 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

有没有更有效/高效的方法来解决这个问题?

【问题讨论】:

    标签: python performance


    【解决方案1】:
    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 创建并返回一个新列表。在这里使用就地操作的好处是,您最终可以节省用于复制项目以创建新列表的时间。

    【讨论】:

    • 非常感谢。有这样的代码 sn-ps 学习非常有帮助
    【解决方案2】:
    import re
    print re.findall('([^,]*find[^,]+)', ','.join(dir(re)))
    

    【讨论】:

    • 我认为使用模块来了解有关模块的更多信息有一定的优雅 - 但又是 IS python。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2021-05-06
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多