我正在处理旅行推销员问题。鉴于所有试剂都穿越相同的图以分别找到自己的路径,因此我试图并行化试剂的路径调查作用。任务是针对每次迭代的,所有代理都从一个开始节点开始,以找到其路径并收集所有路径,以找到当前迭代中的最佳路径。
我正在使用pathos.multiprocessing。
代理类的遍历方法为
class Agent:
def find_a_path(self, graph):
# here is the logic to find a path by traversing the graph
return found_path
我创建一个辅助功能来结束方法
def do_agent_find_a_path(agent, graph):
return agent.find_a_path(graph)
然后创建一个池并通过传递辅助功能,代理实例列表和同一图,
来使用AMAPpool = ProcessPool(nodes = 10)
res = pool.amap(do_agent_find_a_path, agents, [graph] * len(agents))
但是,这些过程是按顺序创建的,并且运行速度非常慢。我想以正确/体面的方式有一些说明来利用这种情况的悲伤。
谢谢!
更新:
我在Ubuntu上使用悲伤0.2.3,
Name: pathos
Version: 0.2.3
Summary: parallel graph management and execution in heterogeneous computing
Home-page: https://pypi.org/project/pathos
Author: Mike McKerns
我在treadpool示例代码中遇到以下错误:
>import pathos
>pathos.pools.ThreadPool().iumap(lambda x:x*x, [1,2,3,4])
Traceback (most recent call last):
File "/opt/anaconda/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2910, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-5-f8f5e7774646>", line 1, in <module>
pathos.pools.ThreadPool().iumap(lambda x:x*x, [1,2,3,4])
AttributeError: 'ThreadPool' object has no attribute 'iumap'```
我是pathos
作者。我不确定您的方法需要多长时间,但是从您的评论来看,我会假设不是很长。我建议,如果该方法是"快速",则使用ThreadPool
。另外,如果您不需要保留结果的顺序,则最快的地图通常是uimap
(无序,迭代地图(。
>>> class Agent:
... def basepath(self, dirname):
... import os
... return os.path.basename(dirname)
... def slowpath(self, dirname):
... import time
... time.sleep(.2)
... return self.basepath(dirname)
...
>>> a = Agent()
>>> import pathos.pools as pp
>>> dirs = ['/tmp/foo', '/var/path/bar', '/root/bin/bash', '/tmp/foo/bar']
>>> import time
>>> p = pp.ProcessPool()
>>> go = time.time(); tuple(p.uimap(a.basepath, dirs)); print(time.time()-go)
('foo', 'bar', 'bash', 'bar')
0.006751060485839844
>>> p.close(); p.join(); p.clear()
>>> t = pp.ThreadPool(4)
>>> go = time.time(); tuple(t.uimap(a.basepath, dirs)); print(time.time()-go)
('foo', 'bar', 'bash', 'bar')
0.0005156993865966797
>>> t.close(); t.join(); t.clear()
和,只是要与需要更长一些的东西进行比较...
>>> t = pp.ThreadPool(4)
>>> go = time.time(); tuple(t.uimap(a.slowpath, dirs)); print(time.time()-go)
('bar', 'bash', 'bar', 'foo')
0.2055649757385254
>>> t.close(); t.join(); t.clear()
>>> p = pp.ProcessPool()
>>> go = time.time(); tuple(p.uimap(a.slowpath, dirs)); print(time.time()-go)
('foo', 'bar', 'bash', 'bar')
0.2084510326385498
>>> p.close(); p.join(); p.clear()
>>>