这是我的 Perl 和 Python 脚本,用于对大约 21 个日志文件进行一些简单的文本处理,每个大约 300 KB 到 1 MB(最大)x 重复 5 次(总共 125 个文件,由于日志重复了 5 次)。
Python 代码(修改为使用已编译re
和使用的代码re.I
)
#!/usr/bin/python
import re
import fileinput
exists_re = re.compile(r'^(.*?) INFO.*Such a record already exists', re.I)
location_re = re.compile(r'^AwbLocation (.*?) insert into', re.I)
for line in fileinput.input():
fn = fileinput.filename()
currline = line.rstrip()
mprev = exists_re.search(currline)
if(mprev):
xlogtime = mprev.group(1)
mcurr = location_re.search(currline)
if(mcurr):
print fn, xlogtime, mcurr.group(1)
Perl 代码
#!/usr/bin/perl
while (<>) {
chomp;
if (m/^(.*?) INFO.*Such a record already exists/i) {
$xlogtime = $1;
}
if (m/^AwbLocation (.*?) insert into/i) {
print "$ARGV $xlogtime $1\n";
}
}
而且,在我的 PC 上,这两个代码都生成了完全相同的 10,790 行结果文件。而且,这是 Cygwin 的 Perl 和 Python 实现的时间安排。
User@UserHP /cygdrive/d/tmp/Clipboard
# time /tmp/scripts/python/afs/process_file.py *log* *log* *log* *log* *log* >
summarypy.log
real 0m8.185s
user 0m8.018s
sys 0m0.092s
User@UserHP /cygdrive/d/tmp/Clipboard
# time /tmp/scripts/python/afs/process_file.pl *log* *log* *log* *log* *log* >
summarypl.log
real 0m1.481s
user 0m1.294s
sys 0m0.124s
最初,使用 Python 需要 10.2 秒,而使用 Perl 只需 1.9 秒即可完成这个简单的文本处理。
(更新)但是,在 Python 的编译re
版本之后,现在在 Python 中需要 8.2 秒,在 Perl 中需要 1.5 秒。Perl 仍然快得多。
有没有办法完全提高 Python 的速度,或者很明显 Perl 将成为简单文本处理的快速方法。
顺便说一句,这不是我为简单文本处理所做的唯一测试……而且,我制作源代码的每一种不同方式,总是 Perl 以很大的优势获胜。m/regex/
而且,在简单的匹配和打印方面,Python 没有一次表现得更好。
请不要建议使用 C、C++、Assembly、其他风格的 Python 等。
与标准 Perl 相比,我正在寻找使用标准 Python 及其内置模块的解决方案(甚至不使用模块)。男孩,由于它的可读性,我希望将 Python 用于我的所有任务,但为了放弃速度,我不这么认为。
所以,请建议如何改进代码以与 Perl 有可比的结果。
更新:2012-10-18
正如其他用户所建议的,Perl 有它的位置,Python 有它的位置。
因此,对于这个问题,可以安全地得出结论,对于成百上千个文本文件的每一行的简单正则表达式匹配并将结果写入文件(或打印到屏幕),Perl 将永远、永远在这项工作的性能上获胜. 就这么简单。
请注意,当我说 Perl 在性能上胜出时……只比较标准 Perl 和 Python……不诉诸一些晦涩难懂的模块(对于像我这样的普通用户来说是晦涩难懂的),也不要从 Python 调用 C、C++、汇编库或 Perl。我们没有时间为简单的文本匹配工作学习所有这些额外的步骤和安装。
因此,Perl 非常适合文本处理和正则表达式。
Python 在其他地方也有它的优势。
2013 年 5月 29 日更新:这里有一篇进行类似比较的优秀文章。Perl 再次赢得了简单文本匹配的胜利……有关更多详细信息,请阅读文章。