8

私の質問は

正規表現パターンの解析中にジャストインタイムのコンパイルを行い、テキストの照合/置換時に使用する正規表現エンジンはありますか? または、i386 または x64 アーキテクチャーの JIT はどこで学べますか?

必要な理由

私は最近、約 10MB のデータを持つ通常の C コードと比較して、Python の組み込み正規表現エンジンをベンチマークしようとしていました。

単純な置換 (たとえば ) の場合、比較的高速であることがわかりましたab。Czzzよりも 2 倍から 3 倍遅いだけです。

ただし、[a-z]cC の 5 ~ 8 倍の時間がかかりました。

また、グループ化 (たとえば([a-z])(c)to AA\2\1BB) を使用すると、C の 20 倍から 40 倍の時間がかかりました。

まだジャストインタイムのコンパイルではありませんが、ジャストインタイムのコンパイルができれば、もっと高速になると思います。

PS: パターンをコンパイルする際に正規表現パターンごとにプロファイリングを使用しabます。 .[a-z]c([a-z])(c)

更新 1

psyco で試してみましたが、速度はそれほど向上しません。何度もループするのではなく、ビッグデータに対してテキストの置き換えを行っているためかもしれません。

私が間違っていなければ、Pythonre.subはすでにネイティブで実行していると思うので、pyscoはそれほど速度を向上させることはできません.

更新 2

Python にラップされたブースト正規表現を試してみましたが、Python の正規表現よりもさらに遅いため、ボトルネックは Python の文字列処理にあるようで、Jan Goyvaerts も回答でそれを指摘しています。

アップデート

ab[a-z]c次の同等の C コード ( *s10MB の長いテキストを指す)のように、正規表現パターンをマシン コードに変換したいと思います。

do{
    if(*s=='a' && s[1]=='b' && s[2]>='a' && s[2]<='z' && s[3]=='c') return 1;
}while(*s++);
return 0;

何か案は?

4

9 に答える 9

5

PCRE には 8.20 以降の JIT コンパイラがあります。ここについて読むことができます:http://sljit.sourceforge.net/pcre.html

于 2011-12-30T22:55:51.343 に答える
3

正規表現を実行可能コードにコンパイルできることがわかっている唯一のregexエンジンは、RegexOptions.Compiledを渡したときの.NETのエンジンです。これにより、RegexクラスはMSILを発行し、MSILは他の.NETコードと同じようにJITされる可能性があります。

.NET正規表現エンジンを他のエンジンよりも高速にするかどうかは、まったく別の問題です。大規模なデータセットで比較的単純な正規表現を使用して検索および置換する場合、文字列の処理がはるかに重要になります。.NET文字列は不変であるため、文字列を再割り当てする必要がある回数に大きく依存します。

コードは同等ではないため、操作を手動でコーディングすると常に高速になります。正規表現コードは、正規表現の一致と、コードが保持していないキャプチャグループに関する特定の情報を保持します。ほとんどの場合、正規表現を使用する代わりに検索と置換を手動でコーディングするために余分な時間を費やしても、努力する価値はありません。特に、要件が変更されたときに別の正規表現に切り替えるのは簡単であると考えている場合は、書き直しを行う必要があります。手続き型コードを使用した検索と置換には、はるかに長い時間がかかります。

私の経験では、PCREは最も高速な正規表現エンジンの1つです。ただし、既製の検索と置換は含まれていません。

于 2009-11-23T14:30:52.253 に答える
2

私は Python の専門家ではありませんが、Psycho を試してみてください。

http://www.ibm.com/developerworks/library/l-psyco.html

http://psyco.sourceforge.net/

于 2009-11-20T08:47:07.853 に答える
2

私があなたを正しく理解していれば、デフォルトではジャストインタイムコンパイルを行わないプログラミング言語を使用していますが、正確にそれを行う正規表現ライブラリを探していますか?

Psycoなどを使用して、すべてのpythonコードをバイナリにコンパイルする必要があると思います

http://www.devshed.com/c/a/Python/How-Python-Runs-Programs/4/

ここでも議論されています:

Python を機械語にコンパイルすることは可能ですか?

そしてここ:

Python をネイティブに (pyc バイトコードを超えて) コンパイルすることは可能ですか?

これらの解決策が機能しないか、まだ十分に高速ではなく、アプリケーションの残りの部分を Python で書きたい場合は、boost python c++ ライブラリがあります。

http://www.boost.org/doc/libs/1_41_0/libs/python/doc/index.html

boost.python ライブラリは、python と c++ の間の完全な相互運用性を可能にします。次に、boost.regex c++ 正規表現マッチャーを使用できます。

http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/html/index.html

于 2009-11-20T08:47:17.073 に答える
2

Firefox の正規表現エンジンは、いくつかの (すべてではない!) 正規表現を機械語にコンパイルします。Safari と Chrome もそうだと思います。

于 2009-11-20T08:52:12.973 に答える
2

あなたの質問にはそれが表示されないので、質問します:「re.compile(pattern)」などのプリコンパイルされた正規表現でテストしましたか??

コンパイルされた正規表現はより高速になるはずです。OK、それは JIT ではありませんが、ほとんどの場合、単にプリコンパイルされたもので問題ありません!

ここを参照してください:

再コンパイル

于 2009-11-20T08:52:40.743 に答える
2

別のアイデア: Python 正規表現モジュールよりも最適なライブラリ (C) がある場合、または正規表現のジャストインタイム コンパイルを行うライブラリがある場合は、C-としょうかん。

もちろん、これは多少手間がかかるため、本当にスピードが必要な場合にのみお勧めします。

Cython (個人的にはまだ使用していませんが、かなり良さそうです) を使ってラッピングを行うこともできます。

私が今あなたの問題を理解している限り、Python周辺はあなたの問題ではありません(したがって、サイコが役立つかどうかは疑問です)-また、正規表現実行の準備はあなたの問題ではありませんが、実行自体は最高速度でなければなりません。もちろん、それは使用するライブラリと、大きな文字列をどれだけうまく処理できるかによって異なります。標準の python regex-lib は、このような長い文字列と最高の速度に最適化されていないと思います。

于 2009-11-20T09:38:52.663 に答える
1

Thompson は、1968 年に ACM の通信で公開された論文を持っていました。この論文では、正規表現を IBM 7094 コードに変換するための動作する JIT コンパイラについて説明しています。彼が使用した言語はわかりません。Fortran や LISP が疑わしいのは明らかで、LISP はすでに JIT コンパイルを行っているため、特に疑わしいと言えます。

于 2010-02-04T15:17:24.400 に答える
1

私は間違っているかもしれませんが、Python の正規表現モジュールは C にあると信じているので、Python をコンパイルするという提案 (Psycho を使用するなど) は大きな違いはありません。実際に比較しているのは、1 つの C 正規表現ライブラリのパフォーマンスです ( Python の) 別の (使用しているライブラリに関係なく)。

于 2009-11-20T18:06:28.263 に答える