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

标签 python list functional-programming filter lambda

我有一个想要按项目属性过滤的列表。

以下哪一项是首选(可读性、性能、其他原因)?

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/

相关文章:

python - 如何提高增量DeltaLake表的合并操作的性能?

clojure - Lisp/Clojure DSL 的中间表示

php - 在支持对象方法作为映射函数的javascript中实现映射?

python - 图像按一定形状调整大小

Python:检查句子是否包含列表中的任何单词(模糊匹配)

python - 有没有办法用 Python 原生解决方案替换 Django 的 smart_str?

c++ - 在 C++ 中使用 STL 时解决边界错误

html - 增加嵌套 (ul ul ul li) 下拉导航列表项的宽度

list - 使可扩展列表的背景透明似乎是不可能的。在 StackOverflow 上测试了所有解决方案

javascript - 如何在javascript中过滤对象子数组的数组和对象子数组的数组