gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:39:59 34 4
gpt4 key购买 nike

这是我的 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/

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