Python结合map与reduce批量归约numpy元组的语法修正
报错原因
代码map(reduce(conflateDistributions),actualDataSizeList)存在两个语法问题:
reduce函数要求至少传入2个参数:归约操作函数、待归约的可迭代对象。当前写法只传入了归约函数conflateDistributions,直接触发TypeError: reduce expected at least 2 arguments, got 1错误。map的第一个参数必须是接收单个入参的可调用对象,传入的reduce(conflateDistributions)是一次缺少参数的错误函数调用,不是合法的映射函数。
修正实现
基础无显式循环版本
用lambda构造单入参的映射函数,将列表中每个seedTuple作为reduce的第二个入参传入,最终得到长度为2000的结果列表,列表中每个元素为(combinedWeights, combinedBins)格式的元组:
from functools import reduce # 复用已定义的conflateDistributions函数、numBins常量,以及存储2000个seedTuple的actualDataSizeList result_list = list(map(lambda single_seed_tuple: reduce(conflateDistributions, single_seed_tuple), actualDataSizeList))
如果需要单独拆分出所有权重、所有箱中心的集合,可以用解包操作:
overallCombinedWeights, overallCombinedBins = zip(*result_list) # 若需要numpy数组格式,直接套np.array转换即可 # overallCombinedWeights = np.array(overallCombinedWeights) # overallCombinedBins = np.array(overallCombinedBins)
高性能并行版本
由于2000个归约任务互相独立无依赖,要进一步提升执行效率(适合需要重复运行批量计算的场景),可以用多进程并行处理,比单线程map的执行速度快数倍到数十倍:
import os from functools import reduce, partial from multiprocessing import Pool # 预绑定归约函数,减少参数传递开销 reduce_task = partial(reduce, conflateDistributions) # 按CPU核心数设置并行进程数,避免不必要的上下文切换 with Pool(processes=os.cpu_count()) as pool: result_list = pool.map(reduce_task, actualDataSizeList)
提示:Python 3.9中
map返回的是惰性迭代器,如果不需要一次性把所有结果加载到内存,可以直接遍历该迭代器处理结果,不需要强制转成list,能降低内存占用。
内容的提问来源于stack exchange,提问作者mbranham
相关产品推荐
相关产品推荐

