gpt4 book ai didi

Python re.sub 算慢吗?

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

我对 Python 还很陌生。我正在构建一个脚本来遍历日志文件,就像我在 Perl 中做过一百次一样。我正在使用哈希来计算日志文件中某些字段的出现次数,就像我在 Perl 中所做的一百次一样:

for $line in (<FILE>) {
($stuff1, $stuff2, $etc) = split(/\s+/, $line);
$stuff1 =~ s/something//;
$stuff2 =~ s/something//;
$count1{$stuff1}++;
$count2{$stuff2}++;
}
etc, print the hashes

我的Python看起来像这样:

import re
from collections import defaultdict

cntdaemon = defaultdict(int)
cntfaclevel = defaultdict(int)
cnthost = defaultdict(int)
redaemon1 = re.compile('\[[0-9]+\]')
redaemon2= re.compile(':')
refaclevel= re.compile(']')
with open("/var/adm/messages", 'r') as infile:
for line in infile:
(m, d, t, host, daemon, junk, idno, faclevel, text) = line.split(' ',8)
daemon = re.sub(redaemon1, '', daemon)
daemon = re.sub(redaemon2, '', daemon)
cntdaemon[daemon] += 1
faclevel = re.sub(refaclevel, '', faclevel)
cntfaclevel[faclevel] += 1
cnthost[host] += 1
print cntdaemon
print cntfaclevel
print cnthost

我发现它的运行速度比 Perl 版本慢大约 20 倍。我已经运行了预编译正则表达式和“即时”编译它们的测试用例,并且差异可以忽略不计,所以我知道Python不会浪费时间编译正则表达式。我怀疑每次我执行“re.sub”时它都会花费所有时间来销毁和编译字符串。

那么,简单的问题 - 有没有一种习惯用法可以更快地进行替换?

我想我总是可以尝试编写一个函数来完成它而不需要赋值......这是一种经常采用的方法吗?人们可以将字符串转换为列表,然后迭代它,C/C++ 字符串样式(好吧,我只是把它扔在那里......)

这可能很重要(这就是为什么我在示例中不使用 Counter() 的原因) - 我需要在 Python 2.6.4 中编写它。如果这在 2.7 或 3 中会快很多,就这么说吧。但我别无选择。

最佳答案

首先,您应该尝试分析每行的运行时间。制作一个像这样的短程序并测量运行需要多长时间。

开始注释掉没有其他计算依赖的行。

line = "blah blah..."     # typical line from the file
for i in range(10000): # pretend there are 10000 lines
(m, d, t, host, daemon, junk, idno, faclevel, text) = line.split(' ',8)
daemon = re.sub(redaemon1, '', daemon)
daemon = re.sub(redaemon2, '', daemon)
cntdaemon[daemon] += 1
faclevel = re.sub(refaclevel, '', faclevel)
cntfaclevel[faclevel] += 1
# cnthost[host] += 1

现在您可以算出 cnthost[host] += 1 需要多长时间

line = "blah blah..."     # typical line from the file
for i in range(10000): # pretend there are 10000 lines
(m, d, t, host, daemon, junk, idno, faclevel, text) = line.split(' ',8)
daemon = re.sub(redaemon1, '', daemon)
daemon = re.sub(redaemon2, '', daemon)
cntdaemon[daemon] += 1
faclevel = re.sub(refaclevel, '', faclevel)
# cntfaclevel[faclevel] += 1
# cnthost[host] += 1 # takes 20 seconds

现在您可以算出 cntfaclevel[faclevel] += 1 需要多长时间

等等

一旦确定了热点 - 然后开始考虑如何使其更快。

如果您可以将正在处理的典型字符串添加到问题中,我们将能够查看是否有可以使用的特定技巧,或者是否有某些特定的操作在性能方面表现不佳。

关于Python re.sub 算慢吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20255358/

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