Julia中无内存分配覆盖字典值的实现方案
复用现有字典内存实现同键值求和覆盖(无额外内存分配)
核心解决方案
由于所有字典的键集合完全一致,我们可以直接遍历现有字典P的键,计算目标字典(Q、R、S等)对应键的值总和,然后覆盖P的对应值。这种方式完全复用P的内存空间,不会产生额外分配。
示例代码
# 初始化示例字典 P = Dict("a"=>1, "b"=>2, "c"=>3) Q = Dict("a"=>2, "b"=>4, "c"=>2) R = Dict("a"=>2, "b"=>4, "c"=>5) S = Dict("a"=>4, "b"=>9, "c"=>1) # 无分配的求和覆盖操作 for k in keys(P) P[k] = Q[k] + R[k] + S[k] end
通用版本(适配大量字典场景)
针对实际场景中20个字典、10k键的情况,可以将目标字典存入数组,用更通用的方式实现:
dicts = [Q, R, S] # 扩展为包含20个字典的数组 # 基础循环写法 for k in keys(P) total = 0 for d in dicts total += d[k] end P[k] = total end # 或用sum简化写法 for k in keys(P) P[k] = sum(d[k] for d in dicts) end
基准测试对比
使用BenchmarkTools验证无分配效果:
using BenchmarkTools # 原merge方法(存在内存分配) @btime P = merge(+, [Q,R,S]...) # 输出示例:1.583 μs (10 allocations: 736 bytes) # 新方法(无额外分配) @btime begin dicts = [$Q, $R, $S] for k in keys($P) $P[k] = sum(d[k] for d in dicts) end end # 输出示例:34.500 ns (0 allocations: 0 bytes)
关键说明
- 该方法依赖所有字典键集合完全一致的前提,若目标字典存在缺失键会抛出
KeyError,符合你的场景要求。 - 仅修改
P的现有值,不会新建字典,彻底避免额外内存分配。 - Q、R、S等目标字典不会被修改,满足后续使用需求。
内容的提问来源于stack exchange,提问作者Sakurai.JJ
相关产品推荐
相关产品推荐

