You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在joblib的Parallel中动态定义函数而非显式声明?

问题

现有如下代码:

from joblib import Parallel, delayed
def process(i):
    return i * i
    
results = Parallel(n_jobs=2)(delayed(process)(i) for i in range(10))

能否不显式定义process函数,而是在Parallel(n_jobs=2)(delayed(<<此处??>>)(i) for i in range(10))中动态定义该函数?

本例中的process是简单单行函数,但实际场景中有更复杂的函数,例如:

def process(i):
    def process_1(j) :
      return i - j + 12 if j > 100 else i + j
    if i > 123 :
      k = process_1(i)
    else :
      k = process_1(i - 23)
    return k * i

希望将这类复杂函数也在Parallel函数内动态定义,而非显式声明。


解决方案

完全可以实现,根据函数复杂度分两种方式处理:

1. 单行简单函数场景

直接用lambda表达式替代显式定义的函数,代码示例:

from joblib import Parallel, delayed

results = Parallel(n_jobs=2)(delayed(lambda i: i * i)(i) for i in range(10))

2. 复杂嵌套/分支函数场景

对于包含内部子函数、多分支判断的复杂逻辑,可以把所有逻辑封装在嵌套的lambda结构里,直接嵌入delayed中,替代原有的显式函数:

from joblib import Parallel, delayed

results = Parallel(n_jobs=2)(
    delayed(
        lambda i: (
            # 嵌套lambda替代原process_1子函数
            lambda j: i - j + 12 if j > 100 else i + j
        )(i if i > 123 else i - 23) * i
    )(i) for i in range(200)  # 扩大范围覆盖i>123的分支场景
)

这种写法完全不需要显式声明process和process_1函数,所有逻辑都动态定义在Parallel的调用链中。

注意事项

如果逻辑过于复杂,嵌套lambda的可读性会大幅下降,这种情况下显式定义函数反而更利于代码维护。但如果必须要动态定义函数,上述方式完全可以满足需求。


内容的提问来源于stack exchange,提问作者Brian Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:38:31