Python:BigFloat+多处理
Python: BigFloat+Multiprocessing
我正在尝试并行化一系列使用 bigfloat
的计算。但是,出现错误
Error sending result: '[BigFloat.exact('1.0000000', precision=20)]'. Reason: 'TypeError('self._value cannot be converted to a Python object for pickling')'
我MWE重现的错误是
from bigfloat import *
from multiprocessing import Pool
def f(x,a,b,N):
with precision(20):
X=BigFloat(x)
for i in range(N):
X = a*X*X-b
return X
if __name__ == '__main__':
pool = Pool(processes=2)
out1,out2 = pool.starmap(f,[(1,2,1,3),(2,2,2,2)])
(函数本身一点都不重要)。如果我不使用 bigfloat
,那么一切都很好。所以,这绝对是 multiprocessing
和 bigfloat
之间的某种互动。
因此,我认为 multiprocessing
在保存 BigFloat 对象时遇到了问题。我似乎无法 "extract" 只有 BigFloat 抛出的值。我该如何解决这个问题?
显然 bigfloat
不支持酸洗,我在做 pickle.dumps(BigFloat(1))
时遇到同样的错误
https://github.com/mdickinson/bigfloat/issues/106 注意到这是需要完成的
作为变通方法,为什么在进程间传输时不直接转换为字符串?即,将 f
更改为 return str(X)
,然后让其他例程根据需要将字符串解析为 BigFloat
s
否则,您可以编写一些代码来支持这一点并将其提交给项目
我正在尝试并行化一系列使用 bigfloat
的计算。但是,出现错误
Error sending result: '[BigFloat.exact('1.0000000', precision=20)]'. Reason: 'TypeError('self._value cannot be converted to a Python object for pickling')'
我MWE重现的错误是
from bigfloat import *
from multiprocessing import Pool
def f(x,a,b,N):
with precision(20):
X=BigFloat(x)
for i in range(N):
X = a*X*X-b
return X
if __name__ == '__main__':
pool = Pool(processes=2)
out1,out2 = pool.starmap(f,[(1,2,1,3),(2,2,2,2)])
(函数本身一点都不重要)。如果我不使用 bigfloat
,那么一切都很好。所以,这绝对是 multiprocessing
和 bigfloat
之间的某种互动。
因此,我认为 multiprocessing
在保存 BigFloat 对象时遇到了问题。我似乎无法 "extract" 只有 BigFloat 抛出的值。我该如何解决这个问题?
显然 bigfloat
不支持酸洗,我在做 pickle.dumps(BigFloat(1))
https://github.com/mdickinson/bigfloat/issues/106 注意到这是需要完成的
作为变通方法,为什么在进程间传输时不直接转换为字符串?即,将 f
更改为 return str(X)
,然后让其他例程根据需要将字符串解析为 BigFloat
s
否则,您可以编写一些代码来支持这一点并将其提交给项目