0

我有大约 30 个文件,每个文件的大小约为 300MB。每个文件中都有一些我感兴趣的信息,例如用户名。现在我想使用正则表达式查找用户名,然后找到最常见的用户名。这是我的代码:

rList=[]
for files in os.listdir("."):
    with open(files,'r') as f:
        for line in f:
            m=re.search('PATTERN TO FIND USERNAME',line)
            if m:
                rList.append(m.group())             
c=Counter(rList)
print c.most_common(10)

现在如您所见,我将找到的每个用户名都添加到列表中,然后调用 Counter()。这样大约需要几分钟才能完成。每次读完文件时,我都尝试删除c=Counter(rList)and 调用,但这不会有任何区别,对吗?c.update()

那么,这是最佳实践吗?有什么方法可以提高性能吗?谢谢!

4

2 回答 2

1

分析将向您显示,在文件的每一行上逐行循环涉及大量开销。如果文件总是在您指定的大小附近,并且您可以使用内存,则通过一次调用将它们放入内存,.read()然后使用更复杂的预编译正则表达式(考虑换行符)来提取所有用户名立刻。然后.update()你的反对象与匹配的正则表达式中的组。这将尽可能高效。

于 2013-09-08T15:21:26.383 回答
0

如果你有记忆,那么:

  1. 使用映射
  2. 尽可能使用隐式循环

以下片段应该很快但需要内存:

# imports elided

patternString = rb'\b[a-zA-Z]+\b' # byte string creating a byte pattern
pattern = re.compile(patternString)
c = Counter()

for fname in os.listdir("."):
    with open(fname, "r+b") as f:
        mm = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
        c.update(pattern.findall(mm))
print(c.most_common(10))

patternString 应该是您的模式。

于 2013-09-09T02:09:15.753 回答