【发布时间】:2012-09-29 09:39:34
【问题描述】:
这是我的 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 秒即可完成这个简单的文本处理。
(更新)但是,在编译 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...不诉诸一些晦涩难懂的模块(对于像我这样的普通用户来说晦涩难懂),也没有调用 C、C++、程序集来自 Python 或 Perl 的库。我们没有时间为简单的文本匹配作业学习所有这些额外的步骤和安装。
因此,Perl 非常适合文本处理和正则表达式。
Python 在其他地方也有它的优势。
2013 年 5 月 29 日更新: 一篇进行类似比较的优秀文章 is here。 Perl 再次在简单文本匹配方面获胜...有关更多详细信息,请阅读文章。
【问题讨论】:
-
模式是否只在 Python 中编译一次(就像在 Perl 中一样)?
-
我想知道差异是否在于在不匹配的行中回溯所花费的时间。
-
我会通过profiler 运行 Python 代码,以发现它在哪里花费时间。您也可以尝试使用 PCRE (Perl Compatible Regular Expressions) 而不是 Python 内置的正则表达式(这里是 another implementation),看看效果是否更好。
-
“因过于本地化而关闭”对我来说似乎太有趣和主观了。
-
我之前看过基准测试,这表明 Perl 的正则表达式实现比 Python 快得多。否则它们的速度应该相当。
标签: python regex performance perl text-processing