gpt4 book ai didi

python - 将 sympy lambda 传递给 multiprocessing.Pool.map

转载 作者:太空狗 更新时间:2023-10-30 01:26:31 24 4
gpt4 key购买 nike

我想并行执行一个 sympy lambda 函数。我不知道:

  • 为什么它是一个 lambda 函数,但它是并行工作的
  • 为什么当我尝试在没有池的情况下执行时它停止工作
  • 为什么如果我取消注释 lambdify 中的第一个返回值会起作用

显然 markdown 预处理器需要在代码上方添加一行文本,所以这是代码:

from multiprocessing import Pool

import sympy
from sympy.abc import x

def f(m):
return m.lambdify()(1)

class Mult():
def lambdify(self):
# return sympy.lambdify(x, 2*x, 'numpy')
self._lambdify = sympy.lambdify(x, 2 * x, 'numpy')
return self._lambdify

if __name__ == '__main__':
with Pool() as pool:
m = Mult()
print(pool.map(f, [m]))
print(pool.map(f, [m]))
print(f(m))
print(pool.map(f, [m]))

它打印:

[2]
[2]
2
PicklingError: Can't pickle <function <lambda> at 0x000000000DF0D048>: attribute lookup <lambda> on numpy failed

(我切断了回溯)

如果我取消注释,它会正常工作:

[2]
[2]
2
[2]

我只在 Windows 上测试过,它与“numexpr”而不是“numpy”完全一样。

最佳答案

Mult 对象在创建时没有字段。因此,它可以用常用的 pickle 库进行腌制。然后,当您调用 lambdify 时,您将 _lambdify 属性添加到包含 lambda 表达式的对象,该表达式不能被 pickle。这会导致 map 函数失败

这解释了为什么在调用 lambdify 之前您可以 pickle 对象并使用 Pool.map 以及为什么它在调用之后失败。当您取消注释 lambdify 中的行时,您不会将属性添加到类中,并且 Mult 对象在调用 lambdify 后仍然可以被 pickled .

关于python - 将 sympy lambda 传递给 multiprocessing.Pool.map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45085095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com