10月17日、Daniel Lemireが「Decoding base64 in Python at 10 gigabytes per second」と題した記事を公開した。SIMDを活用したBase64デコードライブラリ「fastpybase64」がPythonの標準ライブラリの27倍、既存のSIMD対応ライブラリ「pybase64」の4倍の速度を達成したことを紹介している。なお、元記事タイトルは「10 GB/秒」だが、これはベンチマーク結果の概算値であり、実測では64KiB以上のデータで13 GB/秒台を記録している。
標準ライブラリの27倍——SIMDで何が変わるのか
Base64はメール添付ファイル(MIME)、TLS証明書、データURL、JSON内のバイナリエンコードなど至るところで使われる処理だ。にもかかわらず、PythonのBase64処理は長らく「遅くて当たり前」とされてきた。
Python標準のbase64モジュールはC実装ではあるが、1文字ずつ処理する設計のため、64KiBのデータを処理しても0.49 GB/秒に留まる。大量のMIMEメールを処理するバックエンドや画像を多数扱うAPIサーバーでは、この処理がボトルネックになるケースがある。
Daniel Lemireは、Wojciech Muła(simdutfコントリビューター)と共にSIMD命令(Single Instruction, Multiple Data:複数のバイトを1命令で並列処理する技術)を用いたBase64エンコード・デコードの手法を長年研究してきた。SIMDはBase64のような単純なバイト変換処理と相性が良く、メモリコピーに近い速度でのデコードを実現できる。
この研究成果はLemireらのライブラリsimdutfに実装されており、Node.js・Deno・主要ブラウザが実際に採用している。ところが、simdutfにはPythonバインディングが存在しなかった。そこで新たに書かれたのが**fastpybase64**(GitHub / PyPI)だ。
実測値:最大13 GB/秒
インストールとAPIはシンプルで、標準モジュールのドロップイン置換として設計されている。
pip install fastpybase64
import fastpybase64 as base64
base64.b64encode(b"hello") # b'aGVsbG8='
base64.b64decode("aGVsbG8=") # b'hello'
ベンチマークはIntel Xeon Gold 6548N(Emerald Rapids)のシングルコアで実施。入力データはMIME形式(76文字ごとに改行を含むBase64)で、デコード後のバイト列をGigabytes/秒で測定している。
| サイズ | base64(標準) | pybase64 | fastpybase64 |
|---|---|---|---|
| 1 KiB | 0.44 GB/s | 1.5 GB/s | 4.4 GB/s |
| 64 KiB | 0.49 GB/s | 3.1 GB/s | 13.3 GB/s |
| 1 MiB | 0.49 GB/s | 3.2 GB/s | 13.1 GB/s |
pybase64の4倍、標準ライブラリの27倍が結論だ。64KiB以上では約13 GB/秒台で頭打ちになっているが、これはメモリ帯域の上限に近い水準であり、処理自体のボトルネックはほぼ解消されていると見ていい。
なお、pybase64もlibbase64を使ったSIMD対応のCライブラリだが、fastpybase64はその4倍を出している。差の主な要因は、改行を含む「寛容なBase64(forgiving base64)」——改行・空白などの不要文字を無視しながらデコードする方式——をSIMDで一括処理できる点にある。Lemireはこの手法をWojciech Muła、Robert Clauseckerとの共著論文としてACM Transactions on Architecture and Code Optimizationに2026年発表予定としてまとめており、詳細な理論的背景はそちらで確認できる。
対応環境と実用的な注意点
- PyPIからインストール可能(Linux / macOS / Windows)
- Python 3.10〜3.14に対応
- フリースレッド版Python 3.14(GILを排除したビルド。PEP 703で提案され、Python 3.13で実験的導入、3.14で正式サポートが進む)にも対応済み——GILなし環境でマルチスレッド並列処理と組み合わせることで、さらなるスループット向上が期待できる
大量のMIMEメールを処理するバックエンド、TLS証明書の一括検証、画像を多数扱うAPIサーバーなど、Base64のスループットが問題になる場面では試す価値がある。ベンチマークのコードはLemireがブログ記事内で公開しており、再現検証が可能だ。
詳細はDecoding base64 in Python at 10 gigabytes per secondを参照していただきたい。