2

到目前为止,我已经通过将函数映射到使用函数分布到各个集群的列表来并行化函数map_sync(function, list)

现在,我需要对字典的每个条目运行一个函数。

map_sync 似乎不适用于字典。我还尝试分散字典并使用装饰器并行运行该函数。然而,字典似乎也不适合分散。有没有其他方法可以并行化字典上的函数而不必转换为列表?

到目前为止,这些是我的尝试:

from IPython.parallel import Client
rc = Client()
dview = rc[:]

test_dict = {'43':"lion", '34':"tiger", '343':"duck"}
dview.scatter("test",test)

dview["test"]
# this yields [['343'], ['43'], ['34'], []] on 4 clusters
# which suggests that a dictionary can't be scattered?

不用说,当我运行函数本身时,我得到一个错误:

@dview.parallel(block=True)
def run():
    for d,v in test.iteritems():
        print d,v

run()

AttributeError
Traceback(最近一次调用最后一次) in () in run(dict) AttributeError: 'str' object has no attribute 'iteritems'

我不知道它是否相关,但我使用的是连接到 Amazon AWS 集群的 IPython Notebook。

4

1 回答 1

3

您可以使用以下命令分散 dict:

def scatter_dict(view, name, d):
    """partition a dictionary across the engines of a view"""
    ntargets = len(view)
    keys = d.keys() # list(d.keys()) in Python 3
    for i, target in enumerate(view.targets):
        subd = {}
        for key in keys[i::ntargets]:
            subd[key] = d[key]
        view.client[target][name] = subd

scatter_dict(dview, 'test', test_dict)

然后像往常一样远程操作它。

您还可以使用以下命令再次将远程字典收集到一个本地字典中:

def gather_dict(view, name):
    """gather dictionaries from a DirectView"""
    merged = {}
    for d in view.pull(name):
        merged.update(d)
    return merged

gather_dict(dv, 'test')

示例笔记本

于 2013-05-19T03:28:58.607 回答