AutobahnPython と WebSocket4Python の高速化

Python の WebSocket ライブラリの Autobahn と ws4py は、テキストフレームを受信した時にその内容が正しい UTF-8 になっているかどうかをバリデートしています。

このバリデートが1バイトずつの処理を Python でやっているために、 PyPy を使ってない場合は結構重くて、メッセージ量が大きい時に簡単にボトルネックになってしまいます。

そこでこのバリデートを Cython でやる wsaccel を作りました。

pip install wsaccel でインストールできます。 ws4py を使う場合は import wsaccel; wsaccel.patch_ws4py() で ws4py の中の Utf8Validator を Cython 版に置き換えます。

WebSocket の典型的な利用方法だとJSONを転送したりすると思うのですが、このパッチを使うことで WebSocket の処理よりも JSON のデコードの方が圧倒的に重くなります。

これでも遅い場合はJSONの処理に ujson 使うとか、json やめて msgpack の採用を検討してください。

(追記: Utf8Validator 以外にも高速化ポイントが見つかったため、パッケージ名を wsaccel に変更しました)

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。