【发布时间】:2021-01-22 14:58:09
【问题描述】:
我想使用ray 对列表的每个元素执行函数的并行操作。下面是一个简化的sn-p
import numpy as np
import time
import ray
import psutil
num_cpus = psutil.cpu_count(logical=False)
ray.init(num_cpus=num_cpus)
@ray.remote
def f(a, b, c):
return a * b - c
def g(a, b, c):
return a * b - c
def my_func_par(large_list):
# arguments a and b are constant just to illustrate
# argument c is is each element of a list large_list
[f.remote(1.5, 2, i) for i in large_list]
def my_func_seq(large_list):
# arguments a anf b are constant just to illustrate
# argument c is is each element of a list large_list
[g(1.5, 2, i) for i in large_list]
my_list = np.arange(1, 10000)
s = time.time()
my_func_par(my_list)
print(time.time() - s)
>>> 2.007
s = time.time()
my_func_seq(my_list)
print(time.time() - s)
>>> 0.0372
问题是,当我计时my_func_par 时,它比my_func_seq 慢得多(如上图所示~54x)。 ray 的一位作者确实回答了关于 this blog 的评论,这似乎解释了我正在做的是设置 len(large_list) 不同的任务,这是不正确的。
如何使用 ray 并修改上面的代码以并行运行? (也许通过将large_list拆分成块,块的数量等于cpu的数量)
编辑:这个问题有两个重要标准
- 函数
f需要接受多个参数 - 可能需要使用
ray.put(large_list),以便larg_list变量可以存储在共享内存中,而不是复制到每个处理器中
【问题讨论】:
标签: python parallel-processing ray