【发布时间】:2018-09-08 15:19:34
【问题描述】:
看着this question,我意识到如果要并行运行函数列表,使用multiprocessing 的Pool.map 有点尴尬:
from multiprocessing import Pool
def my_fun1(): return 1
def my_fun2(): return 2
def my_fun3(): return 3
with Pool(3) as p:
one, two, three = p.map(lambda f: f(), [my_fun1, my_fun2, my_fun3])
我并不是说它完全是神秘的,但我想我希望它有一些传统的名称,即使只是在 functools 或其他东西中,类似于 JavaScript 中的 apply/call(是的,我知道JavaScript 在定义这些函数时没有 lambda,不,我并不是说 JavaScript 是一种示例性编程语言,只是一个示例)。事实上,我绝对认为operator 中应该有类似的东西,但是(除非我的眼睛欺骗了我)它似乎不存在。我读到in the case of the identity function 的解决方案是让人们定义自己的琐碎功能,在这种情况下我更理解它,因为您可能想要一些不同的变体,但这对我来说感觉像是缺失的一点。
编辑:正如 cmets 中所指出的,Python 2 曾经为此目的有一个 apply 函数。
【问题讨论】:
-
Python 曾经为此内置了一个
apply,但它已被删除。原因与不添加身份的原因大致相同:自己编写 apply 及其所有合理的变体很简单,而且很少使用,所以如果你想要它,就自己写吧。 -
Pool.async_apply在这里似乎很有用。 -
@abarnert 我明白了,我从不知道(或者忘记了)Python 2 中的
apply。我仍然认为在operator中是有意义的(比如reduce被移动了functools),我的意思是,同样的琐碎论点适用于那里的任何东西,但我是谁来质疑 BDFL。无论如何,如果您不介意发布我会接受的答案,我认为这是正确的解释。 -
@jdehesa 如果你想让我挖掘完整的历史和理由来寻找答案,我会的。但突然想到:在 2.1 左右,您无法进行完美的转发(因为 lambdas 没有关键字 splat),所以建议使用 apply。然后 2.2 修复了它,从那时起 Python 一直确保始终允许完美转发。所以没有推荐的 apply 用途,这引发了一个讨论,导致它在 2.3 中被弃用,并附有说明如何自己编写它(或它的变体)的说明。 3.0,删除它而不是移动到 functools 因为没有人使用它。
-
@chepner 是的,但是
apply_async将单个函数作为参数。你可以调用每个函数,但是如果你想将结果提取到局部函数变量中,回调可能会很奇怪......
标签: python python-3.x apply higher-order-functions built-in