- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我必须对图像堆栈的每个切片应用 2D 滤波器,并且我想并行化分析。但是,下面的代码运行速度比正常的 for 循环慢。此外,增加 n_jobs
也会增加处理时间,n_jobs = 1
的处理时间较快,n_jobs = 6 的处理时间较慢
。
import numpy as np
from joblib import Parallel, delayed
from skimage.restoration import denoise_tv_chambolle
arr = np.random.rand(50,50,50)
def f(arr):
arr_h = denoise_tv_chambolle(arr, weight=0.1, multichannel=True)
return arr_h
Parallel(n_jobs=6, backend="threading")(delayed(f)(i) for i in arr)
最佳答案
Q : ( Why ) ... runs slower than a normal for loop ( ? )
>>> 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,50)
-of- float64
,缓存内计算是性能的关键。将 joblib.Parallel
与“ threading
”后端一起使用是相当反模式的(python 使用 GIL
-lock 以便重新 [SERIAL]
-ise 计算一步接一步,因为它避免了任何类型的常见的、与并发相关的冲突)。这种串行计算流在这里甚至更糟,因为“切换”一步接一个会产生额外的成本(而不是纯粹改进原始的- [SERIAL]
代码执行 - 因此您需要付出更多才能获得相同的结果(但是,在更长的时间之后))
Q : increasing
n_jobs
also increase the processing time
当然,它增加了 GIL 锁重新 [SERIAL]
化开销所浪费的时间,因为有更多 one-step-after-another
GIL 定向碰撞避免“切换“-转换。
即使进入完全成熟的并行性,使用基于进程的并行性(避免 GIL 锁定的成本),它也会出现(再次以成本 - 进程实例化成本(完整的 1:1 内存副本) python 解释器进程 n_jobs
- 在 Win O/S 中,类似在 Linux O/S 中 - 如 joblib
模块中所述,包括避免某些其他形式的建议生成并行进程),参数数据传输成本,结果传输成本)。
如果将 n_jobs = 6
的所有这些附加成本相加,并且这些成本只是以小型计算任务的名义累积的(小至 ~ 680 [ms]
) > 在持续时间内),很快就会导致支付更多来设置并行处理比收到的返回(作为其他效果 - 作为比原始缓存更糟糕的结果) -重用-不会“提高”计算速度)。
real-world costs ( and a due accounting for each class-of-(all-such)-costs ) of computing payloads 是原因 (为什么)... 运行速度较慢
关于python - joblib.Parallel() 比 skimage 的 single 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58698601/
我正在努力解决 joblib 问题。 我需要将推理应用程序推送到远程服务器,并且我还需要加载保存的标准缩放器,因为如果我尝试适应,我会收到内存不足异常。我无法对服务器进行物理更改,因为它是 sap c
我在 Docker 容器内的 Flask 应用程序中运行 joblib 以及由 supervisord 启动的 uWSGI(启动时启用线程)。 网络服务器启动显示如下错误: unable to loa
我正在尝试在 python 中使用并行计算包 joblib。我可以执行下面的例子并得到结果 Parallel(n_jobs=8)(delayed(sqrt)(i) for i in range(10)
这是我的代码: from math import sqrt from joblib import Parallel, delayed import multiprocessing def parall
我正在使用Python中joblib包中的Parallel函数。我只想使用此函数来处理我的函数之一,但不幸的是整个代码是并行运行的(除了其他函数)。 示例: from joblib import Pa
我正在努力学习 joblib模块作为 python 中内置 multiprocessing 模块的替代品。我习惯于使用 multiprocessing.imap 在可迭代对象上运行一个函数并返回结果。
我正在尝试使用 joblib 来并行化一个在函数上运行的循环。我希望显示函数的中间 print 命令,而不仅仅是函数的 return 值。 from joblib import Parallel, d
我想打乱 3D numpy 数组中的值,但前提是它们 > 0。 当我用单核运行我的函数时,它甚至比使用 2 个核快得多。这远远超出了创建新 python 进程的开销。我错过了什么? 以下代码输出: r
我的目标结构: 工具 model_maker.py 模特 模型在这里 我当前的代码,位于工具目录中 joblib.dump(pipeline, "../models/model_full_June20
是否可以使用 joblib.Memory 以线程安全的方式写入跨多个进程的公共(public)缓存。在什么情况下,这会失败或导致错误? 最佳答案 库首先写入临时文件,然后将临时文件移动到目的地。 So
我目前正在尝试实现 parallel for循环使用 joblib在 python 中 3.8.3 . 在 for 循环中,我想将一个类方法应用于一个类的实例,同时在另一个类中应用一个方法。 这是一个
我的代码看起来像这样: from joblib import Parallel, delayed # prediction model - 10s of megabytes on disk LARGE
from joblib import Parallel, delayed def func(v): temp.append(v) return temp = [] Parallel(n
有关于使用内存映射文件在 Joblib 中持久保存 Numpy 数组的良好文档。 在最近的版本中,Joblib(显然)会以这种方式自动保留和共享 Numpy 数组。 Pandas 数据帧也会被持久化,
我正在运行一个需要一段时间才能评估 16 次的函数。然而,所有这些运行都是相互独立的。因此我决定使用 joblib 来加速它。 Joblib 的工作方式就像它应该的那样并加快了速度,但我正在努力解决一
我正在使用 joblib 并行化我的 python 3.5 代码。 如果我这样做: from modules import f from joblib import Parallel, delaye
我正在使用 Random Forest Regressor python 的 scikit-learn 模块来预测一些值。我使用 joblib.dump 来保存模型。有 24 个 joblib.dum
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我想问同样的问题 Python 3: does Pool keep the original order of data passed to map?对于作业库。例如: Parallel(n_jobs
我需要在使用 Joblib 并行的函数中生成随机数。但是,从内核生成的随机数是完全相同的。 目前我通过为不同的核心分配随机种子来解决这个问题。有什么简单的方法可以解决这个问题吗? 最佳答案 这是预料之
我是一名优秀的程序员,十分优秀!