Python-列表理解与lambda +过滤器

发布于 2021-02-02 23:20:20

我碰巧发现自己有一个基本的过滤需求:我有一个列表,并且必须按项目的属性对其进行过滤。

我的代码如下所示:

my_list = [x for x in my_list if x.attribute == value]

但是后来我想,这样写会更好吗?

my_list = filter(lambda x: x.attribute == value, my_list)

它更具可读性,并且如果需要性能,则可以取出lambda以获得某些东西。

问题是:使用第二种方法是否有任何警告?有任何性能差异吗?我是否完全想念Pythonic Way™,应该以另一种方式来做到这一点(例如,使用itemgetter而不是lambda)吗?

关注者
0
被浏览
105
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    我发现列表理解比filter+ 清晰得多lambda,但请使用任何你更容易理解的列表。

    有两件事可能会减慢你对的使用filter

    第一个是函数调用开销:使用Python函数(无论是由def还是创建的lambda)后,过滤器的运行速度可能会比列表理解速度慢。几乎可以肯定,这还不够重要,并且在对代码进行定时并发现它是瓶颈之前,你不应该对性能进行太多考虑,但是区别就在那里。

    可能适用的其他开销是,lambda被强制访问作用域变量(value)。这比访问局部变量要慢,并且在Python 2.x中,列表推导仅访问局部变量。如果你使用的是Python 3.x,则列表推导是在单独的函数中运行的,因此它也将value通过闭包进行访问,并且这种区别将不适用。

    要考虑的另一个选项是使用生成器而不是列表推导:

    def filterbyvalue(seq, value):
       for el in seq:
           if el.attribute==value: yield el
    

    然后,在你的主要代码(这才是真正的可读性)中,你已经用有希望的有意义的函数名称替换了列表理解和过滤器。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看