Q :(为什么)... 运行速度比普通for循环(?)
>>> import numpy as np; _ = np.random.rand( 50,50,50)
>>> from zmq import Stopwatch; aClk = Stopwatch()
>>>
>>> aClk.start(); r = denoise_tv_chambolle( _,weight = 0.1,multichannel = True ); b = aClk.stop(); print( "The code took {0: > 9d}[us]".format( b ) )
The code took 679749[us]
The code took 683137[us]
The code took 678925[us]
The code took 688936[us]
考虑到(50,50)
-float64
中的微型数据形状,缓存内计算是性能的关键。结合使用joblib.Parallel
和' threading
'后端是一种反模式(python使用 GIL
-lock以便重新-[SERIAL]
-使计算 一步一步 ,因为它避免了任何常见的并发相关冲突。这样的串行计算流程在这里变得更加糟糕,因为“转换” 一步一步 会产生额外的费用(不能纯粹地改善原始的{ {1}}代码执行-因此,您需要为获得相同的价格而付出更多的代价(但是,经过更长的时间))
Q :增加 [SERIAL]
也会增加处理时间
当然,由于存在更多的 n_jobs
GIL导向的避免冲突,它会增加GIL锁重新[SERIAL]
化开销的时间浪费” 切换 ”-过渡。
最后但并非最不重要
即使使用基于进程的并行机制(避免了GIL锁定的成本)进入完全成熟的并行机制,也要付出代价(同样要付出成本-进程实例化的成本(完整的1:1内存副本) python解释器进程在Win O / S中运行 one-step-after-another
次-与在Linux O / S中类似-如 n_jobs
模块中所述,包括建议避免产生其他形式的并行进程),参数数据传输成本,结果传输成本)。
如果一个人为 joblib
添加了所有这些附加费用,并且这些费用只是以一个微型计算任务的名义(如 n_jobs = 6
),很快就会导致支付更多的费用来设置并行处理比将要收到的(其他效果-比原始的缓存重用更糟糕-不会“提高”计算速度)。
real-world costs ( and a due accounting for each class-of-(all-such)-costs ) of computing payloads 是原因 (Why)... 运行速度慢
本文链接:https://www.f2er.com/3164740.html