gpt4 book ai didi

python - 如何使python for循环更快

转载 作者:行者123 更新时间:2023-12-05 01:03:35 25 4
gpt4 key购买 nike

我有一个字典列表,如下所示:

[{'user': '123456', 'db': 'db1', 'size': '8628'}
{'user': '123456', 'db': 'db1', 'size': '7168'}
{'user': '123456', 'db': 'db1', 'size': '38160'}
{'user': '222345', 'db': 'db3', 'size': '8628'}
{'user': '222345', 'db': 'db3', 'size': '8628'}
{'user': '222345', 'db': 'db5', 'size': '840'}
{'user': '34521', 'db': 'db6', 'size': '12288'}
{'user': '34521', 'db': 'db6', 'size': '476'}
{'user': '2345156', 'db': 'db7', 'size': '5120'}.....]

此列表包含数百万个条目。每个用户可以在多个数据库中找到,每个用户可以在同一个数据库中拥有多个整体。我想总结一下每个用户每个 db 占用的大小。我不想使用 Pandas 。目前我是这样做的:

  • 我创建了 2 个唯一用户和唯一数据库列表
  • 使用这些列表遍历大列表并总结用户和数据库相同的地方
result = []
for user in unique_users:
for db in unique_dbs:
total_size = 0
for i in big_list:
if (i['user'] == user and i['db'] == db):
total_size += float(i['size'])
if(total_size) > 0:
row = {}
row['user'] = user
row['db'] = db
row['size'] = total_size
result.append(row)

问题在于,这个三重 for 循环发展成非常大的东西(数千亿次迭代),需要永远总结结果。如果 big_list 很小,这很好用。

我应该如何处理它以保持快速和简单?非常感谢!

最佳答案

目前的方法有两个主要问题:低效的算法低效的数据结构

首先是所使用的算法显然效率低下,因为它在大列表上迭代了很多次。不需要遍历整个列表来过滤唯一用户和数据库。您可以遍历大列表一次并使用字典聚合数据。目标字典的键只是一个 (user, db) 元组。字典的值为 total_size。这是一个未经测试的示例:

# Aggregation part
# Note: a default dict can be used instead to make the code possibly simpler
aggregate_dict = dict()
for i in big_list:
key = (i['user'], i['db'])
value = float(i['size'])
if key in aggregate_dict:
aggregate_dict[key] += value
else:
aggregate_dict[key] = value

# Fast creation of `result`
result = []
for user in unique_users:
for db in unique_dbs:
total_size = aggregate_dict.get((user, key))
if total_size is not None and total_size > 0:
result.append({'user': user, 'db': db, 'size': total_size})

另一个问题是低效的数据结构:对于每一行,键被复制,而可以使用元组代替。实际上,更好的数据结构是存储 (column, items) 键值的字典,其中 items 是目标列的项目列表。这种存储数据的方式称为数据帧。这大致是 Pandas 内部使用的(除了它是一个更好的 Numpy 数组,因为它比大多数操作的列表更紧凑且通常更有效)。将这种数据结构用于输入和输出应该会导致显着的加速(如果与 Numpy 结合使用)和更低的内存占用

关于python - 如何使python for循环更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74025103/

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