gpt4 book ai didi

python - 性能 - 在文本文件中搜索字符串 - Python

转载 作者:行者123 更新时间:2023-11-28 19:43:21 26 4
gpt4 key购买 nike

我有一组日期:

dates1 = {'21/5/2015', '4/4/2015', '15/6/2015', '30/1/2015', '19/3/2015', '25/2/2015', '25/5/2015', '8/2/2015', '6/6/2015', '15/3/2015', '15/1/2015', '30/5/2015'}

相同的日期出现在文本中(从现在开始为“数据”)。这是一个很长的文本。我想遍历文本并获取每个日期在文本中出现的次数,然后打印出现次数更多的 5 个日期。

我现在拥有的是:

def dates(data, dates1):
lines = data.split("\n")
dict_days = {}
for day in dates1:
count = 0
for line in lines:
if day in line:
count += 1
dict_days[day] = count

newA = heapq.nlargest(5, dict_days, key=dict_days.get)

print(newA)

我将 tex 分成几行,创建一个字典,对于列表中的每个日期,它会在每一行中查找它,如果找到它,它会加 1 进行计数。

这工作正常,但运行此方法需要很长时间。

所以我想问的是,是否有人知道更有效的方法来做同样的事情

任何帮助将不胜感激

编辑

我会尝试每一个答案并让你知道,提前致谢

最佳答案

循环一次,提取任何日期,检查日期是否在集合中,如果是,使用 Counter 增加计数计数的字典,最后调用 Counter.most_common 以获得 5 个最常见的日期:

dates1 = {'21/5/2015', '4/4/2015', '15/6/2015', '30/1/2015', '19/3/2015', '25/2/2015', '25/5/2015', '8/2/2015', '6/6/2015', '15/3/2015', '15/1/2015', '30/5/2015'}


from collections import Counter
import re

def dates(data, dates1):
lines = data.split("\n")
dict_days = Counter()
r = re.compile("\d+/\d+/\d+")
for line in lines:
match = r.search(line)
if match:
dte = match.group()
if dte in dates1:
dict_days[dte] += 1
return dict_days.most_common(5)

这对行列表进行一次传递,而不是对 dates1 中的每个日期进行一次传递。

对于 100k 行,日期字符串位于 200 多个字符的字符串末尾:

In [9]: from random import choice

In [10]: dates1 = {'21/5/2015', '4/4/2015', '15/6/2015', '30/1/2015', '19/3/2015', '25/2/2015', '25/5/2015', '8/2/2015', '6/6/2015', '15/3/2015', '15/1/2015', '30/5/2015'}

In [11]: dtes = list(dates1)

In [12]: s = "the same dates appear in a text ('data' from now on). It's a pretty long text. I want to loop over the text and get the number of times each date appear in the text, then i print the 5 dates with more occurances. "

In [13]: data = "\n".join([s+ choice(dtes) for _ in range(100000)])

In [14]: timeit dates(data,dates1)
1 loops, best of 3: 662 ms per loop

如果每一行可以出现多个日期,您可以使用 findall:

def dates(data, dates1):
lines = data.split("\n")
r = re.compile("\d+/\d+/\d+")
dict_days = Counter(dt for line in lines
for dt in r.findall(line) if dt in dates1)
return dict_days.most_common(5)

如果数据实际上不是对象之类的文件而是单个字符串,只需搜索字符串本身:

def dates(data, dates1):
r = re.compile("\d+/\d+/\d+")
dict_days = Counter((dt for dt in r.findall(data) if dt in dates1))
return dict_days.most_common(5)

编译测试数据上的日期似乎是最快的方法,拆分每个子字符串非常接近搜索实现:

def dates_split(data, dates1):
lines = data.split("\n")
dict_days = Counter(dt for line in lines
for dt in line.split() if dt in dates1)
return dict_days.most_common(5)

def dates_comp_date1(data, dates1):
lines = data.split("\n")
r = re.compile("|".join(dates1))
dict_days = Counter(dt for line in lines for dt in r.findall(line))
return dict_days.most_common(5)

使用上面的函数:

In [63]: timeit dates(data, dates1)
1 loops, best of 3: 640 ms per loop

In [64]: timeit dates_split(data, dates1)
1 loops, best of 3: 535 ms per loop

In [65]: timeit dates_comp_date1(data, dates1)
1 loops, best of 3: 368 ms per loop

关于python - 性能 - 在文本文件中搜索字符串 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32487979/

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