- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 python(在 ubuntu 上)下运行并行进程。
我开始使用 multiprocessing,对于简单的示例来说效果很好。
然后出现了 pickle 错误,所以我转向了 pathos。我对不同的选项感到有点困惑,因此编写了一个非常简单的基准测试代码。
import multiprocessing as mp
from pathos.multiprocessing import Pool as Pool1
from pathos.pools import ParallelPool as Pool2
from pathos.parallel import ParallelPool as Pool3
import time
def square(x):
# calculate the square of the value of x
return x*x
if __name__ == '__main__':
dataset = range(0,10000)
start_time = time.time()
for d in dataset:
square(d)
print('test with no cores: %s seconds' %(time.time() - start_time))
nCores = 3
print('number of cores used: %s' %(nCores))
start_time = time.time()
p = mp.Pool(nCores)
p.map(square, dataset)
# Close
p.close()
p.join()
print('test with multiprocessing: %s seconds' %(time.time() - start_time))
start_time = time.time()
p = Pool1(nCores)
p.map(square, dataset)
# Close
p.close()
p.join()
print('test with pathos multiprocessing: %s seconds' %(time.time() - start_time))
start_time = time.time()
p = Pool2(nCores)
p.map(square, dataset)
# Close
p.close()
p.join()
print('test with pathos pools: %s seconds' %(time.time() - start_time))
start_time = time.time()
p = Pool3()
p.ncpus = nCores
p.map(square, dataset)
# Close
p.close()
p.join()
print('test with pathos parallel: %s seconds' %(time.time() - start_time))
我知道了
- 0.001s 纯串行代码,无并行,
- 0.100s multiprocessing
选项,
- 0.100 秒,pathos.multiprocessing
,
- 4.470 秒,pathos.pools
,
- AssertionError
错误与 pathos.parallel
我从 http://trac.mystic.cacr.caltech.edu/project/pathos/browser/pathos/examples.html 复制了如何使用这些不同的选项
我知道对于这样一个简单的例子,并行处理比普通的串行代码要长。我不明白的是悲情的相对表现。
我检查了讨论,但无法理解为什么 pathos.pools
如此长,以及为什么我会收到错误(不确定最后一个选项的性能如何)。
我还尝试了一个简单的平方函数,为此即使 pathos.multiprocessing
也比 multiprocessing
谁能解释一下这些不同选项之间的区别?
此外,我在远程计算机上运行了 pathos.multiprocessing
选项,运行的是 centOS,性能比 multiprocessing
差了大约 10 倍 .
根据租用电脑的公司的说法,它应该像家用电脑一样工作。我知道如果没有关于机器的更多详细信息,可能很难提供信息,但如果您对它的来源有任何想法,那将会有所帮助。
最佳答案
我是 pathos
的作者。对困惑感到抱歉。您正在处理新旧编程接口(interface)的混合。
"new"(建议)接口(interface)是使用 pathos.pools
。旧界面链接到相同的对象,因此实际上有两种方法可以达到相同的目的。
multiprocessing.Pool
是 multiprocessing.Pool
的分支,唯一的区别是 multiprocessing
使用 pickle
和 multiprocess
使用 dill
。因此,我希望在大多数简单情况下速度相同。
上述池也可以在 pathos.pools._ProcessPool
中找到。 pathos
为几种类型的池提供了一个小的包装器,具有不同的后端,提供了扩展的功能。 pathos
包装的池是 pathos.pools.ProcessPool
(旧接口(interface)在 pathos.multiprocessing.Pool
中提供)。
首选接口(interface)是 pathos.pools.ProcessPool
。
还有 ParallelPool
,它使用不同的后端——它使用 ppft
而不是 multiprocess
。 ppft
是“并行 python”,它通过 subprocess
生成 python 进程并传递源代码(使用 dill.source
而不是序列化对象)——它是用于分布式计算,或者当通过源代码传递时是更好的选择。
因此,pathos.pools.ParallelPool
是首选接口(interface),而 pathos.parallel.ParallelPool
(以及 pathos
中的一些其他类似引用>) 由于遗留原因而徘徊——但它们在下面是同一个对象。
总结:
>>> import multiprocessing as mp
>>> mp.Pool()
<multiprocessing.pool.Pool object at 0x10fa6b6d0>
>>> import multiprocess as mp
>>> mp.Pool()
<multiprocess.pool.Pool object at 0x11000c910>
>>> import pathos as pa
>>> pa.pools._ProcessPool()
<multiprocess.pool.Pool object at 0x11008b0d0>
>>> pa.multiprocessing.Pool()
<multiprocess.pool.Pool object at 0x11008bb10>
>>> pa.pools.ProcessPool()
<pool ProcessPool(ncpus=4)>
>>> pa.pools.ParallelPool()
<pool ParallelPool(ncpus=*, servers=None)>
你可以看到 ParallelPool
有 servers
...因此是为分布式计算而设计的。
唯一剩下的问题是为什么 AssertionError
?那是因为 pathos
添加的包装器保留了一个池对象以供重用。因此,当您第二次调用 ParallelPool
时,您调用的是一个封闭池。您需要重新启动
池才能再次使用它。
>>> f = lambda x:x
>>> p = pa.pools.ParallelPool()
>>> p.map(f, [1,2,3])
[1, 2, 3]
>>> p.close()
>>> p.join()
>>> p.restart() # throws AssertionError w/o this
>>> p.map(f, [1,2,3])
[1, 2, 3]
>>> p.close()
>>> p.join()
>>> p.clear() # destroy the saved pool
ProcessPool
与 ParallelPool
具有相同的接口(interface),关于重新启动和清除已保存的实例。
关于python - pathos: parallel processing options - 有人能解释一下差异吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48990688/
标签和 Paper 之间的空间
我有一个任务,我正在尝试与 pathos 并行处理。当我运行非并行版本时,它运行得很好。但是,运行 1 个进程的 pathos 池会导致运行时错误:超出最大递归深度。 例如: import patho
我的一个代码可以 from pathos.multiprocessing import ProcessingPool def myFunc(something): thispool = Pro
import pathos.multiprocessing as mp class Model_Output_File(): """ Class to read Model Outpu
我正在使用 pathos.multiprocessing 来并行化需要使用实例方法的程序。这是一个最小的工作示例: import time import numpy as np from pathos
我正在使用多处理和 pathos 编写一些 python 代码。我写了一个小测试程序来习惯使用多处理,它在我的本地机器上运行良好,但它拒绝在不同的集群上运行。 我收到以下错误: Traceback (
我有在 Windows 上运行的 Python 代码,但是在 Linux 上运行时它只是挂起。我正在使用 JPype,所以我怀疑多个共享进程试图使用同一个管道访问 Java 可能存在一些问题(创建了不
众所周知, pathos.multiprocessing 优于 Python 中的 multiprocessing 库,因为前者使用 dill 而不是 pickle 并且可以序列化更广泛的功能和其他东
在将我的大部分代码构建为 dill 序列化/酸洗之后,我还尝试使用 pathos multiprocessing 来并行化我的计算。 Pathos 它是莳萝的自然延伸。 尝试嵌套运行时 from pa
我尝试在我的项目中使用 pathos.multiprocessing.Pool。但是,当我终止Pool时,它会遇到以下问题。我使用的是 CentOS 6.5,我不确定它是由 pathos.multip
当我尝试运行以下代码时: from pathos.multiprocessing import ProcessingPool as Pool list1 = [1,2,3,4,5] list2 = [
我有一个类,它使用 GDAL 模块( https://pypi.org/project/GDAL/ )打开一个大光栅图像,并在多个位置从中提取小图像,这些位置由传递的坐标元组列表定义。我想使用 Pat
我正在尝试在 python(在 ubuntu 上)下运行并行进程。 我开始使用 multiprocessing,对于简单的示例来说效果很好。 然后出现了 pickle 错误,所以我转向了 pathos
我有一个需要运行的计算列表。我正在使用 并行化它们 from pathos.multiprocessing import ProcessingPool pool = ProcessingPool(no
我目前正在使用 python 中的标准多处理来生成一堆将无限期运行的进程。我不是特别关心性能;每个线程只是在监视文件系统上的不同更改,并在文件被修改时采取适当的操作。 目前,我有一个解决方案可以在 L
我遇到了 Pathos 的 ProcessingPool.map() 函数的低效并行化:在处理结束时,一个运行缓慢的 worker 按顺序处理列表中的最后一个任务,而其他 worker闲置。我认为这是
我遇到了 Pathos 的 ProcessingPool.map() 函数的低效并行化:在处理结束时,一个运行缓慢的 worker 按顺序处理列表中的最后一个任务,而其他 worker闲置。我认为这是
我正在尝试从 git 安装 pathos 库,但出现以下错误: >pip install https://github.com/uqfoundation/pathos Exception: Trace
我正在对我拥有的数据集运行拼写校正功能。我用过 from pathos.multiprocessing import ProcessingPool as Pool做这项工作。处理完成后,我想实际访问结
我是一名优秀的程序员,十分优秀!