运行athos.multiprocessing中实例列表的相同方法



我正在处理旅行推销员问题。鉴于所有试剂都穿越相同的图以分别找到自己的路径,因此我试图并行化试剂的路径调查作用。任务是针对每次迭代的,所有代理都从一个开始节点开始,以找到其路径并收集所有路径,以找到当前迭代中的最佳路径。

我正在使用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)

然后创建一个池并通过传递辅助功能,代理实例列表和同一图,

来使用AMAP
pool = 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()
>>> 

相关内容

  • 没有找到相关文章

最新更新