这是我的Perl和Python脚本,可以对大约21个日志文件进行一些简单的文本处理,每个日志文件大约300 KB到1 MB(最大)x重复5次(总共125个文件,由于日志重复了5次)。
Python代码(修改为使用已编译re
和using的代码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秒。
(UPDATE),但是在re
Python的编译版本之后,现在在Python中需要8.2秒,在Perl中需要1.5秒。Perl仍然更快。
有没有一种方法可以提高Python的速度,或者很明显,Perl将成为简单文本处理的快速工具。
顺便说一下,这不是我对简单文本处理所做的唯一测试...而且,我以各种不同的方式来编写源代码,始终总是Perl大获全胜。而且,在简单的m/regex/
匹配和打印方面,Python从未有过更好的表现。
请不要建议使用C,C ++,Assembly,其他版本的Python等。
我正在寻找使用标准Python及其内置模块与标准Perl(甚至不使用模块)进行比较的解决方案。伙计,由于它的可读性,我希望使用Python来完成所有任务,但是为了放弃速度,我认为不是。
因此,请提出如何改进代码以使其与Perl具有可比结果的建议。
更新时间:2012-10-18
正如其他用户所建议的那样,Perl占有一席之地,Python占有一席之地。
因此,对于这个问题,可以放心地得出结论,对于每行成百上千个文本文件的简单正则表达式匹配并将结果写入文件(或打印到屏幕上),Perl总是会在这项工作中始终赢得性能。就这么简单。
请注意,当我说Perl赢得性能时……仅比较了标准Perl和Python……没有求助于一些晦涩难懂的模块(对于像我这样的普通用户而言晦涩难懂),也没有从Python调用C,C ++,汇编库或Perl。我们没有时间去学习所有这些额外的步骤和简单文本匹配作业的安装。
因此,Perl致力于文本处理和正则表达式。
Python在其他地方也占有一席之地。
2013年5月29日更新:此处有一篇出色的文章,做了类似的比较。Perl再次因简单的文本匹配而获胜。有关更多详细信息,请阅读文章。