[Python] PEP 393 について

Python 3.3.0 beta2 リリース予定の日なので、3.3 系の変更 PEP 393 Flexible String Representation (フレキシブルな文字列表現) [1] について見てみます。GSoC 2011 で採択 [2] されていたようです。

PEP 393 のタイトル通り、文字列の内部形式をフレキシブルに、ASCII のみとそれ以外を分けたりします。また、それ以外の点でも変更があります。

これまでの問題点

Python 3 系では、2 系で分かれていた str と unicodeunicode に統合されています。unicode は、configure オプションで ucs2 もしくは ucs4 を指定することで、内部で使用するデータサイズが異なっていました。

なんでもかんでも unicode になると、ASCII 7bit のような 1 バイト範囲で表せる文字列に対して無駄が多くなります。

PEP 393 変更点の概要

  • ucs2/ucs4 ビルド区分廃止。ucs4 ビルドのように振舞います。Windows プラットホームでも同様。
  • ucs2 ビルドが実質無くなったため、その関連のバグ解決
  • sys.maxunicode がいつも 0x10FFFF

内部での文字列のサイズ

内部で文字列が保持される場合、文字列によってコードポイントで以下のようになります。

  • ASCII と Latin 1 (U+0000-U+00FF) 1 byte
  • BMP 文字列 (U+0000-U+FFFF) 2 byte
  • non-BMP 文字列 (U+10000-U+10FFFF) 4 byte

多くのコードでは、コードやその他 XMLJSON などなどは ASCII 文字ばかりのため、すべて unicode になっている場合と比べてメモリの使用量が減ります。ucs4 ビルドと比較するとかなり減るようです。


旧 C API との互換性あり、以前の API は deprecated 扱いで最低5年保守されるようです。


[1] http://www.python.org/dev/peps/pep-0393/
[2] http://wiki.python.org/moin/SummerOfCode/2011/PEP393