优化:在ipyparallel中传递大数组映射的替代方法?

2024-06-10 07:41:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我最初在python中编写了一个test3d数组上的嵌套for循环。因为我想将它应用到更大的数组中,这将花费更多的时间,所以我决定将ipyparallel作为函数编写并使用bview.map文件. 这样我就可以利用超级计算机上的多个核心/节点。你知道吗

然而,当代码被发送到超级计算机上时,实际上速度较慢。当我分析的时候,似乎大部分时间都花在

方法'acquire'of'螺纹锁紧'对象

来自其他堆栈交换线程的消息表明,这是由于共享数据导致了同步导致的速度减慢。你知道吗

我试着用地图代替地图同步,但是时间。睡眠在这种情况下占用的时间差不多。你知道吗

使用map或其他方法的正确方法是什么?你知道吗

出现问题的代码段:

    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__)

Tags: of方法pynumpymapinit时间地图