gpt4 book ai didi

python - 提高元组列表到字典的转换速度

转载 作者:太空宇宙 更新时间:2023-11-04 00:18:26 24 4
gpt4 key购买 nike

我有一个列表 l由长度为 5 的元组组成。前四个条目是字符串,最后一个是整数。创建此类列表的虚拟函数可能如下所示:

import numpy as np
import uuid
def get_dummy_data(n=10000):
l = []
for i in range(n):
name = np.random.choice(["Cat", "Dog", "Duck"], 1)[0]
c_id = uuid.uuid4().hex
t_id = uuid.uuid4().hex
l.append((c_id, t_id, name, "canFly", 1))
if np.random.random() < 0.8:
l.append((c_id, t_id, name, "isHungry", 0))
return l

现在这个列表l包含前三个元素相同但后两个元素不同的元组。这通过以 80% 的机会再次附加相同的元组但更改最后两个元素来举例说明。

目标是将这个长度为 5 的元组列表转换成字典,其中键是元组的第一个条目 (c_id),值的结构如下 (t_id, (name, {"isHungry": 0})) 或者这个: (t_id, (name, {"canFly":1, "isHungry":0})).

这可以通过以下循环实现:

res = {}
for y in l:
if y[0] not in res:
res[y[0]] = (y[1], (y[2], {y[3]: y[4]}))
else:
res[y[0]][1][1].update({y[3]: y[4]})

现在的问题是:我可以让它更快吗?列表中可能有两个以上的元组 l与相同c_id (与 get_dummy_data 函数相反)并且我们不能假定 l 中的任何顺序.在执行显式 for 循环来填充 dict 时,我总是有一种不好的感觉,所以我敢打赌有一种使它更快的好方法。

最佳答案

您可以进行基本的微优化,这也使您的代码更具可读性。一个大的是不使用 some_dict.update({x:y}) 而不是 some_dict[x] = y。但这里有一些时间差异:

In [12]: %%timeit
...: res = {}
...: for y in data:
...: if y[0] not in res:
...: res[y[0]] = (y[1], (y[2], {y[3]: y[4]}))
...: else:
...: res[y[0]][1][1].update({y[3]: y[4]})
...:
100 loops, best of 3: 15.3 ms per loop

In [13]: %%timeit
...: res = {}
...: for a,b,c,d,e in data:
...: if a not in res:
...: res[a] = (b, (c, {d: e}))
...: else:
...: res[a][1][1][d] = e
...:
100 loops, best of 3: 11 ms per loop

这里是 .update。请注意,每个 y[...] 都是一个方法调用,这会减慢速度。但是节省时间的最大部分是避免了 .update({...}。请注意,该方法无缘无故地需要创建整个 dict 对象:

In [18]: %%timeit
...: res = {}
...: for a,b,c,d,e in data:
...: if a not in res:
...: res[a] = (b, (c, {d: e}))
...: else:
...: res[a][1][1].update({d:e})
...:
100 loops, best of 3: 13.8 ms per loop

关于python - 提高元组列表到字典的转换速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50051491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com