我最初在python中的测试3D数组上编写了一个嵌套for循环。由于我想将它应用于需要花费更多时间的大型数组,因此我决定使用ipyparallel进行并行化,将其作为函数编写并使用bview.map。这样我就可以利用超级计算机上的多个核心/节点。
然而,当发送到超级计算机时,代码实际上更慢。当我描述时,似乎花费的时间主要在
上方法&#39>获得' of' thread.lock'对象
来自其他堆栈交换线程的表明这是由于共享数据导致由于同步而导致速度减慢。
我尝试使用map而不是map_sync,但在这种情况下time.sleep占用大约相同的时间。
使用地图或替代方法的正确方法是什么?
问题代码如下所示:
SSIMarray = numpy.zeros((imx,imy,imz))
cenx, ceny, cenz= zip(*itertools.product(range(0,imx), range(0,imy), range(0,imz)))
amr= bview.map_sync(SSIMfunc, cenx, ceny, cenz)
SSIMarray = (numpy.asarray(amr))
和分析器结果
60823909 function calls (60593868 primitive calls) in 201.869 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
1089003 113.937 0.000 113.937 0.000 {method 'acquire' of 'thread.lock' objects}
64080 5.223 0.000 6.873 0.000 uuid.py:579(uuid4)
384352 4.933 0.000 5.145 0.000 {cPickle.dumps}
640560 4.526 0.000 6.064 0.000 threading.py:260(__init__)
64019 3.704 0.000 16.941 0.000 asyncresult.py:95(_init_futures)
640560 3.338 0.000 9.402 0.000 threading.py:242(Condition)
64077 3.222 0.000 31.562 0.000 client.py:935(_send)
320327 2.359 0.000 8.756 0.000 _base.py:287(__init__)