ipyparallel 附加到列表的并行 for 循环
ipyparallel Parallel for loop that appends to list
我有一个循环,它执行大量 CPU 密集计算并将结果附加到列表中,每次迭代。
我怎样才能让它并行工作。 C#上有并发容器,在ipyparallel中如何工作?
来自 ipyparallel 文档:
Python’s builtin map() functions allows a function to be applied to a sequence element-by-element. This type of code is typically trivial to parallelize.
http://ipyparallel.readthedocs.io/en/latest/direct.html#parallel-map
因此,使用 map 函数使其 运行 并行是一个问题,但如何将结果附加到列表中?这里有并发容器吗?
所以,我现在拥有的是这样的:
results = []
for element in list:
outcome = very_heavy_computation_function(element)
results.append(outcome)
如何并行执行此操作?
您可以通过以下方式实现。
函数foo
表示循环中的计算,parameters
表示要迭代的数据(如果有的话)。尽管 foo
休眠了 10 秒,但整个循环只需要 10 秒而不是 40 秒,因为我的环境中有 4 个引擎,并且 运行 在引擎上并行运行。 LoadBalancedView 提供动态负载平衡以在引擎之间平均分配工作。
from ipyparallel import Client
rc = Client()
view = rc.load_balanced_view()
def foo(param):
import time
time.sleep(10)
return param*2
parameters = list(range(4))
async_results = []
for p in parameters:
async_result = view.apply_async(foo, p)
async_results.append(async_result)
rc.wait_interactive(async_results)
results = [ar.get() for ar in async_results]
print(results)
输出:
4/4 tasks finished after 10 s
done
[0, 2, 4, 6]
我有一个循环,它执行大量 CPU 密集计算并将结果附加到列表中,每次迭代。
我怎样才能让它并行工作。 C#上有并发容器,在ipyparallel中如何工作?
来自 ipyparallel 文档:
Python’s builtin map() functions allows a function to be applied to a sequence element-by-element. This type of code is typically trivial to parallelize.
http://ipyparallel.readthedocs.io/en/latest/direct.html#parallel-map
因此,使用 map 函数使其 运行 并行是一个问题,但如何将结果附加到列表中?这里有并发容器吗?
所以,我现在拥有的是这样的:
results = []
for element in list:
outcome = very_heavy_computation_function(element)
results.append(outcome)
如何并行执行此操作?
您可以通过以下方式实现。
函数foo
表示循环中的计算,parameters
表示要迭代的数据(如果有的话)。尽管 foo
休眠了 10 秒,但整个循环只需要 10 秒而不是 40 秒,因为我的环境中有 4 个引擎,并且 运行 在引擎上并行运行。 LoadBalancedView 提供动态负载平衡以在引擎之间平均分配工作。
from ipyparallel import Client
rc = Client()
view = rc.load_balanced_view()
def foo(param):
import time
time.sleep(10)
return param*2
parameters = list(range(4))
async_results = []
for p in parameters:
async_result = view.apply_async(foo, p)
async_results.append(async_result)
rc.wait_interactive(async_results)
results = [ar.get() for ar in async_results]
print(results)
输出:
4/4 tasks finished after 10 s
done
[0, 2, 4, 6]