Python大字典中列表的元素级高效求平均方法
高效实现大字典中列表的元素级平均
给定如下结构的大Python字典(每个值为等长列表):
my_dict = { "a": [2,5,3], "b": [1,0,2], "c": [5,2,5] }
需要计算所有列表对应索引元素的平均值,期望输出为 [2.6 2.3 3.3]。由于字典规模极大,嵌套循环的朴素方法效率不足,以下是更高效的实现方案:
核心方案:利用NumPy向量化运算
NumPy的底层基于C实现,能避免Python循环的额外开销,是处理大规模数值运算的最优选择,具体实现步骤如下:
- 将字典中的所有列表转换为二维NumPy数组
- 对数组按列计算平均值(对应原列表的索引位置)
代码示例:
import numpy as np my_dict = { "a": [2,5,3], "b": [1,0,2], "c": [5,2,5] } # 将字典值转为二维数组,每行对应原字典中的一个列表 arr = np.array(list(my_dict.values())) # axis=0表示沿行方向计算,即求每列的均值(对应原列表的索引元素) avg = arr.mean(axis=0) print(avg) # 输出: [2.66666667 2.33333333 3.33333333]
效率优势说明
- 完全规避Python层面的嵌套循环,所有计算在NumPy的底层C代码中完成,大幅降低循环开销
- NumPy数组采用连续内存块存储,比Python列表的分散存储更适合大规模数值运算
- 内置的
mean方法经过高度优化,比手动累加再除法的实现更高效
内存受限场景的优化方案
如果字典规模过大,无法一次性将所有列表加载为二维数组,可采用分块累加的方式,避免内存溢出:
import numpy as np my_dict = { "a": [2,5,3], "b": [1,0,2], "c": [5,2,5] } # 初始化累加数组和计数 list_len = len(next(iter(my_dict.values()))) total = np.zeros(list_len, dtype=np.float64) count = 0 for lst in my_dict.values(): total += np.array(lst) count += 1 avg = total / count print(avg)
该方法无需一次性加载所有数据,适合内存有限的场景,效率仍远优于纯Python循环。
内容的提问来源于stack exchange,提问作者bart
相关产品推荐
相关产品推荐

