如何用Julia的map函数模拟嵌套列表推导式?适用于pmap并行映射
用Julia的map/pmap模拟嵌套列表推导式
嘿,我完全懂你想用map(尤其是并行场景下的pmap)来复现嵌套列表推导式的需求——不管是生成扁平化的一维数组,还是保持二维矩阵结构,这在并行计算里确实能帮上大忙!
先给你对应两种推导式的具体实现方案:
1. 模拟扁平化的一维嵌套推导式
对应原推导式 [x+y for x in [0,10] for y in [1,2,3]],我们可以借助笛卡尔积迭代器来实现:
# 串行map版本 result_flat = map(((x,y),) -> x+y, Iterators.product([0,10], [1,2,3])) |> collect |> vec # 并行pmap版本 result_flat_parallel = pmap(((x,y),) -> x+y, Iterators.product([0,10], [1,2,3])) |> collect |> vec
解释下逻辑:Iterators.product 会生成两个输入数组的笛卡尔积迭代器,每个元素是 (x,y) 元组;map接收元组计算x+y后,collect会先转成二维数组,最后vec把它扁平化,就能得到和原推导式一致的 [1,2,3,11,12,13]。
2. 模拟保持二维结构的嵌套推导式
对应原推导式 [x+y for x in [0,10], y in [1,2,3]],实现更直接,不需要扁平化步骤:
# 串行map版本 result_matrix = map(((x,y),) -> x+y, Iterators.product([0,10], [1,2,3])) |> collect # 并行pmap版本 result_matrix_parallel = pmap(((x,y),) -> x+y, Iterators.product([0,10], [1,2,3])) |> collect
这里Iterators.product的结构本身就和推导式的二维布局对应,collect之后直接得到2×3的数组,和原推导式输出完全一致。
另一种更贴近推导式逻辑的写法
如果你觉得元组解构有点繁琐,也可以用嵌套map的形式,更贴合推导式的“外层遍历x,内层遍历y”的逻辑:
xs = [0,10] ys = [1,2,3] # 扁平化结果 result_flat = map(x -> map(y -> x+y, ys), xs) |> vec # 并行版:外层用pmap result_flat_parallel = pmap(x -> map(y -> x+y, ys), xs) |> vec # 二维矩阵结果 result_matrix = map(x -> map(y -> x+y, ys), xs) |> collect
小提醒:用pmap的时候要注意任务规模——如果单个计算任务很小,进程调度的开销可能会抵消并行带来的加速效果,适合用在计算量较大的场景里。
内容的提问来源于stack exchange,提问作者WallyKlondike
相关产品推荐
相关产品推荐

