我有一个想要按项目属性过滤的列表。
以下哪一项是首选(可读性、性能、其他原因)?
xs = [x for x in xs if x.attribute == value]
xs = filter(lambda x: x.attribute == value, xs)
最佳答案
奇怪的是,不同的人有多少不同的美丽。我发现列表理解比 filter
+lambda
更清晰,但使用任何你觉得更容易的。
有两件事可能会减慢您使用 filter
的速度。
首先是函数调用开销:一旦你使用 Python 函数(无论是由 def
还是 lambda
创建的),filter 很可能会比列表理解。几乎可以肯定,这还不够重要,在您对代码进行计时并发现它是一个瓶颈之前,您不应该过多考虑性能,但差异将会存在。
另一个可能产生的开销是 lambda 被强制访问一个作用域变量(value
)。这比访问局部变量要慢,并且在 Python 2.x 中,列表推导仅访问局部变量。如果您使用的是 Python 3.x,则列表推导在单独的函数中运行,因此它也将通过闭包访问 value
,而这种差异将不适用。
要考虑的另一个选项是使用生成器而不是列表推导:
def filterbyvalue(seq, value):
for el in seq:
if el.attribute==value: yield el
然后,在您的主代码(可读性真正重要的地方)中,您已将列表推导和过滤器替换为希望有意义的函数名称。
关于python - 列表理解与 lambda + 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3013449/