Python中对同一数据集依次执行多个预处理函数的简洁实现方法
Python列表链式预处理优化方案
原写法会产生大量冗余的中间临时变量,新增、修改预处理步骤时需要改动多处代码,维护成本高,你可以用以下几种更简洁的实现方式:
方案1:使用标准库
functools.reduce实现函数管道
无第三方依赖,适合快速使用,只需要把所有预处理函数按执行顺序放到列表里即可:from functools import reduce my_list0 = [1, 2, 3, ...] # 按执行顺序排列预处理函数 process_pipeline = [function_foo, function_bar, function_fizz, function_buzz] result = reduce(lambda res, func: func(res), process_pipeline, my_list0)后续要新增处理步骤直接往
process_pipeline里加对应函数即可,维护成本极低。方案2:封装自定义管道函数
可读性更高,也便于中途加调试逻辑,提前封装通用管道方法后可以全局复用:def pipe(value, *funcs): for func in funcs: value = func(value) return value # 调用时直接按顺序传入处理函数即可 result = pipe(my_list0, function_foo, function_bar, function_fizz, function_buzz)如果需要调试中间结果,只需要在
pipe函数的循环里加一行打印逻辑就能看到每一步的输出。方案3:生成器链式处理(适合大体积列表)
如果处理的列表体量很大,用生成器可以避免产生大量中间临时列表,大幅降低内存占用:def preprocess_pipeline(data): data = function_foo(data) yield from function_bar(data) yield from function_fizz(data) yield from function_buzz(data) result = list(preprocess_pipeline(my_list0))
补充说明
如果你的预处理函数需要传入额外参数,可以用functools.partial或者匿名函数包装后再加入管道:
from functools import partial process_pipeline = [ partial(function_foo, offset=3), # 给function_foo固定传入offset=3参数 lambda x: function_bar(x, filter_flag=True), # 用lambda包装传参 function_fizz, function_buzz ]
内容的提问来源于stack exchange,提问作者travelsandbooks
相关产品推荐
相关产品推荐

