在 sympy 中使用多处理

using multiprocessing with sympy

我有一个大方程,我使用 Sympy 库来求解它,以防符号变量和大量方程 Python 花费大量时间来求解。 我如何在这个问题中使用多处理? UPD:是的,我必须用不同的变量解决它近1000~10000次。

>>> price = Symbol('price')
>>> k = delta * np.divide(1., Piecewise((0, z <= 0), (z, z > 0)))
>>> wantedEstate = (wealth / (price + self.q / self.rate)) * Piecewise((1, k > 1), (k, k <= 1)) - realEstate
>>> return wantedEstate

我看不出你到底想做什么,因为你还没有发布完整的代码片段……但我可以做一些近似的事情。

您需要构建一个函数,如下所示。然后使用平行地图。 (我使用的是 pathos 库而不是 multiprocessing b/c 我是作者,它可以从解释器交互使用,并且很容易接受多个参数)。

>>> import sympy 
>>> price = sympy.Symbol('price')
>>> def estate(x, y, z):
...   k = 2*price + x  
...   return z*k**2 + y*k 
... 
>>> estate(1,2,3)
4*price + 3*(2*price + 1)**2 + 2
>>> 
>>> x = range(10)  
>>> y = range(-5,5)
>>> z = range(20,0,-2)
>>>
>>> from pathos.pools import ProcessPool   
>>> pool = ProcessPool()
>>> pool.map(estate, x, y, z)
[80*price**2 - 10*price, -8*price + 18*(2*price + 1)**2 - 4, -6*price + 16*(2*price + 2)**2 - 6, -4*price + 14*(2*price + 3)**2 - 6, -2*price + 12*(2*price + 4)**2 - 4, 10*(2*price + 5)**2, 2*price + 8*(2*price + 6)**2 + 6, 4*price + 6*(2*price + 7)**2 + 14, 6*price + 4*(2*price + 8)**2 + 24, 8*price + 2*(2*price + 9)**2 + 36]

或者,如果你想要一个非阻塞的 map:

>>> res = pool.imap(estate, x, y, z)
>>> res.next()
80*price**2 - 10*price
>>> res.next()
-8*price + 18*(2*price + 1)**2 - 4
>>> res.next()
-6*price + 16*(2*price + 2)**2 - 6
>>> list(res)      
[-4*price + 14*(2*price + 3)**2 - 6, -2*price + 12*(2*price + 4)**2 - 4, 10*(2*price + 5)**2, 2*price + 8*(2*price + 6)**2 + 6, 4*price + 6*(2*price + 7)**2 + 14, 6*price + 4*(2*price + 8)**2 + 24, 8*price + 2*(2*price + 9)**2 + 36]

完成后,不要忘记关闭:

>>> pool.close()
>>> pool.join()

但是,如果您想使用传统的 multiprocessing(假设您的 map 只有一个参数),它看起来像这样:

>>> def doit(x):
...   return x+2*x
... 
>>> # use the standard multiprocessing interface
>>> import pathos.multiprocessing as mp
>>> pool = mp.Pool()
>>> pool.map(doit, x)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
>>> pool.close()
>>> pool.join()

还有一个线程池(multiprocessing.dummy 中也有),使用线程而不是进程:

>>> from pathos.pools import ThreadPool 
>>> pool = ThreadPool()
>>> pool.map(doit, x)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
>>> pool.close()
>>> pool.join()

map 还有其他风格(例如,如果结果的顺序无关紧要,请使用 pathos 中的 uimap,这与 imap_unordered 相同来自 multiprocessing).