python - 文本处理 - Python 与 Perl 的性能对比

标签 python regex performance perl text-processing

这是我的 Perl 和 Python 脚本,用于对大约 21 个日志文件进行一些简单的文本处理,每个大约 300 KB 到 1 MB(最大)x 重复 5 次(总共 125 个文件,由于 log 重复 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 秒即可完成这个简单的文本处理。

(UPDATE) 但是,在编译 Python 的 re 版本之后,现在在 Python 中需要 8.2 秒,在 Perl 中需要 1.5 秒。 Perl 仍然快得多。

有没有一种方法可以提高 Python 的速度,或者显然 Perl 将成为简单文本处理速度最快的方法。

顺便说一句,这不是我为简单文本处理所做的唯一测试......而且,我制作源代码的每一种不同方式,总是 Perl 以很大的优势获胜。而且,在简单的 m/regex/ 匹配和打印内容方面,Python 从未有过更好的表现。

Please do not suggest to use C, C++, Assembly, other flavours of Python, etc.

I am looking for a solution using Standard Python with its built-in modules compared against Standard Perl (not even using the modules). Boy, I wish to use Python for all my tasks due to its readability, but to give up speed, I don't think so.

So, please suggest how can the code be improved to have comparable results with Perl.

更新:2012-10-18

正如其他用户所建议的,Perl 占有一席之地,Python 占有一席之地。

因此,对于这个问题,可以安全地得出结论,对于成百上千个文本文件的每一行的简单正则表达式匹配并将结果写入文件(或打印到屏幕),Perl 将永远,永远赢得这项工作的表现。就这么简单。

请注意,当我说 Perl 在性能方面胜出时...仅比较标准 Perl 和 Python...不诉诸一些晦涩难懂的模块(对于像我这样的普通用户来说晦涩难懂),也不调用 C、C++、程序集来自 Python 或 Perl 的库。我们没有时间为简单的文本匹配作业学习所有这些额外的步骤和安装。

因此,Perl 非常适合文本处理和正则表达式。

Python 在其他地方也有它的优势。

2013-05-29 更新: 进行类似比较的优秀文章 is here . Perl 再次在简单文本匹配方面获胜...有关更多详细信息,请阅读文章。

最佳答案

这正是 Perl 旨在做的事情,所以它更快并不让我感到惊讶。

您的 Python 代码中的一个简单优化是预编译这些正则表达式,这样它们就不会每次都重新编译。

exists_re = re.compile(r'^(.*?) INFO.*Such a record already exists')
location_re = re.compile(r'^AwbLocation (.*?) insert into')

然后在你的循环中:

mprev = exists_re.search(currline)

mcurr = location_re.search(currline)

这本身不会神奇地使您的 Python 脚本与您的 Perl 脚本保持一致,但是在没有先编译的情况下在循环中重复调用 re 在 Python 中是不好的做法。

关于python - 文本处理 - Python 与 Perl 的性能对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12793562/

相关文章:

mysql - 将数据存储在一张大表中或每月创建新表

python - 在 matplotlib 直方图中设置相对频率

python - 如何 reshape 颜色 channel 的 numpy 图像数组

javascript - 为什么此正则表达式 "^(0[1-9]|1[0-9]|2[0-9]|3[01])/(0[1-9]|1[012])/(19[0-9]{2}|20[0-1][0-7])$"对于 16/06/2008、21/02/2008 等日期会失败......?

javascript - 如果我在 for 循环中调用一个包含 for 循环的函数,那是 O(n^2) 时间还是 O(n)?

c - 索引与指针

python - Celery 配置文件位置

python - 在 Ubuntu VM 上创建 TUN 设备似乎不起作用

php - 带有序通配符的 MySQL 搜索,并提取它们的值

Java正则表达式查找双引号