Python中对称函数的高效缓存策略优化:减少函数调用方案咨询
优化对称函数的缓存与循环策略
原方案的问题
原缓存key的实现存在两个明显缺陷:
- 集合转列表的顺序不确定,可能导致
(a,b)和(b,a)生成不同的key,缓存完全失效; - 集合→列表→字符串的转换操作开销大,远不如直接使用可哈希的有序结构作为key高效。
方案一:用有序元组作为缓存key
直接将两个参数排序后组成元组(元组是可哈希类型),无需任何字符串转换,既保证(a,b)和(b,a)的key一致,又大幅提升效率:
i = range(10) # 实际数据量更大 def func(a, b): return a + b cache = {} total = 0 for i_prime in i: for i_prime_prime in i: if i_prime != i_prime_prime: # 生成有序元组作为key,确保对称对的key唯一 key = tuple(sorted((i_prime, i_prime_prime))) if key in cache: total += cache[key] else: temp = func(i_prime, i_prime_prime) cache[key] = temp total += temp
方案二:重构循环,彻底避免重复计算
既然func(a,b)=func(b,a),可以直接只计算i_prime < i_prime_prime的组合,将结果乘以2后累加到总和,完全无需缓存,效率最高:
i = range(10) # 实际数据量更大 def func(a, b): return a + b total = 0 for idx, i_prime in enumerate(i): # 只遍历当前元素之后的元素,避免重复计算对称对 for i_prime_prime in i[idx+1:]: temp = func(i_prime, i_prime_prime) total += temp * 2
原循环中每对(a,b)和(b,a)会被重复计算,总和等价于2倍的所有a<b的func(a,b)之和,此方案通过缩小遍历范围直接消除了重复调用的开销。
内容的提问来源于stack exchange,提问作者epelaez
相关产品推荐
相关产品推荐

