作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
让我们定义:
from multiprocessing import Pool
import numpy as np
def func(x):
for i in range(1000):
i**2
return 1
func()
会执行某些操作,并且始终返回少量的
1
。
Pool.map()
v/s一个串行,内置python的
map()
n=10**3
a=np.random.random(n).tolist()
with Pool(8) as p:
%timeit -r1 -n2 p.map(func,a)
%timeit -r1 -n2 list(map(func,a))
38.4 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 2 loops each)
200 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 2 loops each)
38.3 [ms]
大约是
200[s]
的1/8
Pool.map()
,为简单起见,我以这种方式使用列表列表:
n=10**3
m=10**4
a=np.random.random((n,m)).tolist()
with Pool(8) as p:
%timeit -r1 -n2 p.map(func,a)
%timeit -r1 -n2 list(map(func,a))
292 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 2 loops each)
209 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 2 loops each)
n=10**3
m=10**5
a=np.random.random((n,m)).tolist()
with Pool(8) as p:
%timeit -r1 -n2 p.map(func,a)
%timeit -r1 -n2 list(map(func,a))
3.29 s ± 0 ns per loop (mean ± std. dev. of 1 run, 2 loops each)
179 ms ± 0 ns per loop (mean ± std. dev. of 1 run, 2 loops each)
map()
的时间与子列表大小无关。因此,一个合理的解释是
Pool.map()
确实将那些大子列表的内容传递给了引起额外复制的进程吗?
func()
保证不会更改/修改子列表。
最佳答案
您的工作职能过早结束:
In [2]: %timeit func(1)
335 µs ± 12.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
1000 * 1000
次而不是
1000
次,您将看到它再次扩展,
1000000
循环在我的mac上大致花费
0.4s
,与开销相比足够高。
n
的测试结果,我使用
Pool(4)
,因为我有4个内核,测试仅运行一次,而不是像
%timeit
那样多次运行,导致差异不明显:
n
成比例地增加,每个工作函数调用都分担了多处理的开销。
ratio > 1
:
multiprocessing
不会扩展。
关于python - 大型对象: How to achieve better parallel scaling in python?列表上多处理Pool.map()的缩放比例不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60128189/
我是一名优秀的程序员,十分优秀!