2019年7月6日

dict の要素順

Python 3.6 および 3.7 にかけて行われた大きな変更の一つが、「dict の要素順が挿入順となった」です。

従来の dict では、要素順は特に定められておらず、実装依存となっていました。
以下は CPython 3.5 の動作例です。

>>> d = dict()
>>> d['A'] = 10
>>> d['B'] = 11
>>> d['C'] = 12
>>> d['D'] = 13
>>> d['E'] = 14
>>> d['F'] = 15
>>> d
{'D': 13, 'A': 10, 'F': 15, 'C': 12, 'E': 14, 'B': 11}  # 要素順は規定なし

一方、CPython 3.6 だと以下の動作になります。
>>> d = dict()
>>> d['A'] = 10
>>> d['B'] = 11
>>> d['C'] = 12
>>> d['D'] = 13
>>> d['E'] = 14
>>> d['F'] = 15
>>> d
{'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15}  # 要素順が挿入順
要素順が実装依存であるよりは、何らかの規則順である方が一般に扱いやすいと考えられ、意味のある変更ではないかと思います。



dict というプログラムの根幹を支える型に変更が加えられた経緯は、以下のようになります。

① 元々 PEP468 として、要素順を挿入順にしたいという提案があった。
https://www.python.org/dev/peps/pep-0468

② PyPy の dict の実装は、挿入順を保つようになっていた(さらに、省メモリ・高速)。

③ CPython 3.6 の dict は、PyPy の実装を参考に、挿入順を保つように変更。さらに省メモリ化・高速化も達成。(ただし、Python 3.6 時点での変更は CPython の実装のみ。)
https://docs.python.org/3.6/whatsnew/3.6.html

④ Python 3.7 からは、dict の仕様が変更されることとなり、挿入順を保つことが求められるようになった。
https://docs.python.org/3.7/library/stdtypes.html

なお、③の CPython の実装を行ったのは、INADA Naokiさんという日本人の方のようです。このような言語コア部分の改善を日本人の方が行っていると思うと胸アツですね。

0 件のコメント:

コメントを投稿