これは、約 21 個のログ ファイルから単純なテキスト処理を行うための Perl および Python スクリプトです。それぞれ約 300 KB から 1 MB (最大) x 5 回繰り返されます (ログが 5 回繰り返されるため、合計 125 ファイル)。
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 秒かかりました。
(更新) しかし、Python のコンパイル済みre
バージョンの後、Python で 8.2 秒、Perl で 1.5 秒かかるようになりました。それでも、Perl の方がはるかに高速です。
Python の速度をまったく向上させる方法はありますか、それとも単純なテキスト処理では Perl が高速であることは明らかです。
ところで、これは私が単純なテキスト処理のために行った唯一のテストではありませんでした...そして、ソースコードを作成するさまざまな方法で、常に Perl が大きな差で勝っています。そして、Python が単純なm/regex/
突き合わせや出力の処理で優れたパフォーマンスを発揮したことは一度もありません。
C、C++、アセンブリ、その他の種類の Python などの使用を提案しないでください。
標準Perlと比較した組み込みモジュールを備えた標準Pythonを使用したソリューションを探しています(モジュールを使用していません)。少年、読みやすさのためにすべてのタスクにPythonを使用したいのですが、速度をあきらめるために、そうは思いません。
ですから、Perl と同等の結果が得られるようにコードを改善する方法を提案してください。
更新: 2012 年 10 月 18 日
他のユーザーが示唆したように、Perl にはその場所があり、Python にはその場所があります。
したがって、この質問については、何百または何千ものテキスト ファイルの各行での単純な正規表現の一致と、結果をファイルに書き込む (または画面に出力する) 場合、Perl は常に、常にこのジョブのパフォーマンスで勝つと安全に結論付けることができます。 . それと同じくらい簡単です。
Perl がパフォーマンスで勝っているという場合、標準的な Perl と Python のみが比較されていることに注意してください...いくつかのあいまいなモジュール (私のような通常のユーザーにはあいまいです) に頼らず、Python から C、C++、アセンブリ ライブラリを呼び出しません。またはパール。単純なテキスト マッチング ジョブの追加の手順とインストールをすべて学習する時間はありません。
したがって、Perl はテキスト処理と正規表現に最適です。
Python には、他の場所で揺るがす場所があります。
2013 年5 月 29 日更新:同様の比較を行う優れた記事はこちらです。Perl は単純なテキスト マッチングで再び勝利します... 詳細については、記事を参照してください。