gpt4 book ai didi

python - 优化 python 循环

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:52 25 4
gpt4 key购买 nike

以下循环在我的程序中造成了巨大的瓶颈。特别是因为记录可能超过 500k。

records = [item for sublist in records for item in sublist] #flatten the list
for rec in records:
if len(rec) > 5:
tag = '%s.%s' %(rec[4], rec[5].strip())
if tag in mydict:
mydict[tag][0] += 1
mydict[tag][1].add(rec[6].strip())
else:
mydict[tag] = [1, set(rec[6].strip())]

我看不出有什么方法可以通过字典/列表理解来做到这一点,而且我不确定调用 map 对我有多大帮助。有什么办法可以优化这个循环吗?

编辑:字典包含有关程序中发生的某些操作的信息。 rec[4] 是包含操作的包,rec[5] 是操作的名称。原始日志包含一个 int 而不是实际名称,因此当将日志文件读入列表时,将查找 int 并将其替换为操作名称。增量计数器计算操作执行了多少次,集合包含操作的参数。我正在使用一个集合,因为我不希望参数重复。 strip 只是为了去除空白。此空白的存在在 rec[6] 中是不可预测的,但在 rec[4]rec[5] 中是一致的。

最佳答案

您可以使用 itertools.chain.from_iterable 直接迭代其扁平化的迭代器,而不是扁平化如此庞大的列表。 .

from itertools import chain

for rec in chain.from_iterable(records):
#rest of the code

这也比等效的基于嵌套 for 循环的 genexp 版本快大约 3 倍:

In [13]: records = [[None]*500]*10000

In [14]: %%timeit
...: for rec in chain.from_iterable(records): pass
...:
10 loops, best of 3: 54.7 ms per loop

In [15]: %%timeit
...: for rec in (item for sublist in records for item in sublist): pass
...:
10 loops, best of 3: 170 ms per loop

In [16]: %%timeit #Your version
...: for rec in [item for sublist in records for item in sublist]: pass
...:
1 loops, best of 3: 249 ms per loop

关于python - 优化 python 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25693550/

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