Lab*_*abo 5 python sympy multiprocessing
我想并行执行一个sympy lambda函数.我不知道:
lambdify显然降价预处理器需要在代码上方的一行文本,所以这是代码:
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]))
Run Code Online (Sandbox Code Playgroud)
它打印:
[2]
[2]
2
PicklingError: Can't pickle <function <lambda> at 0x000000000DF0D048>: attribute lookup <lambda> on numpy failed
Run Code Online (Sandbox Code Playgroud)
(我削减了追溯)
如果我取消注释,它会正常工作:
[2]
[2]
2
[2]
Run Code Online (Sandbox Code Playgroud)
我只在Windows上测试过它与'numexpr'完全相同而不是'numpy'.
该对象Mult在创建时没有字段。因此可以用库存pickle库对其进行腌制。然后,当您调用 时lambdify,您_lambdify将向包含表达式的对象添加一个属性lambda,该属性无法被 pickle。map这会导致功能失败
这解释了为什么在调用之前lambdify您可以腌制对象并使用Pool.map以及为什么它在调用后失败。当您取消注释 中的行时lambdify,您不会将该属性添加到类中,并且Mult在调用 后仍然可以对对象进行 pickle lambdify。
| 归档时间: |
|
| 查看次数: |
666 次 |
| 最近记录: |