如何在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
相关产品推荐
相关产品推荐

