def amount_to_summary(sm_list): """ 合并多图xy轴数据,x轴无对应返回none :return: """ lbl = [] generator = [] for sm in sm_list: s = OrderedDict(zip(sm[1], sm[2])) generator.append(s) lbl.append(sm[-1]) final_generator = [] for i, gt in enumerate(generator): if i == 0: for k, v in gt.items(): gt[k] = [v] final_generator = gt else: for f, g in final_generator.items(): g.append(None) final_generator[f] = g for k, v in gt.items(): default_v = [v if x == i else None for x in range(i + 1)] rv = final_generator.setdefault(k, default_v) if default_v != rv: rv[-1] = v final_generator[k] = rv final_generator = OrderedDict(sorted(final_generator.items(), key=lambda t: t[0])) return final_generator, lbl
时间: 2024-01-23 08:02:23 浏览: 319
这是一个生成器函数,它将给定的 sm_list 中的多个字典进行合并,并返回一个 OrderedDict 对象和一个标签列表。以下是几个简单的优化建议:
1. 避免使用 OrderedDict。如果不需要维护字典的插入顺序,可以使用普通的 dict,因为它的查找速度更快。
2. 避免创建不必要的列表。在此函数中,创建了两个不必要的列表:generator 和 lbl。可以使用生成器表达式来代替它们,从而减少内存开销。
3. 避免使用 setdefault。setdefault 是一个相对较慢的操作,因为它需要进行两次查找。可以使用 defaultdict 来代替 setdefault。
4. 避免使用 enumerate。enumerate 会创建一个枚举对象,它需要额外的内存。可以使用 range(len(sm_list)) 代替 enumerate(sm_list),从而避免创建枚举对象。
下面是优化后的代码:
```python
from collections import defaultdict
def amount_to_summary(sm_list):
"""
合并多图xy轴数据,x轴无对应返回none
:return:
"""
final_dict = {}
labels = (sm[-1] for sm in sm_list)
for i in range(len(sm_list)):
s = dict(zip(sm_list[i][1], sm_list[i][2]))
for k, v in s.items():
if k not in final_dict:
final_dict[k] = [None] * i
final_dict[k].append(v)
final_dict = {k: v for k, v in sorted(final_dict.items())}
return final_dict, list(labels)
```
这个版本中,我们使用了生成器表达式来代替列表生成器。我们也使用了普通的 dict 和 defaultdict 来避免使用 setdefault。最后,我们使用了一个简单的 for 循环来代替 enumerate。
阅读全文