目前,两者的细微差别在于 bson.son.SON 仍然向后兼容 Python 2.7 和 older versions。
此外,SON 序列化速度比OrderedDict 快的论点在 2018 年不再正确。
son 模块是 added in Jan 8, 2009。
collections.OrderedDict(PEP-372) 在Mar 2, 2009 的python 中添加。
虽然日期的差异并不能说明哪个先发布,但有趣的是,Mongodb 已经为其用例实现了有序映射。我猜他们可能已经决定继续维护它以实现向后兼容性,而不是将其代码库中的所有 SON 引用切换到 collections.OrderedDict
在两者的小型实验中,您很容易看到collections.OrderedDict 的性能优于bson.son.SON。
In [1]: from bson.son import SON
from collections import OrderedDict
import copy
print(set(dir(SON)) - set(dir(OrderedDict)))
{'weakref', 'iteritems', 'iterkeys', 'itervalues', 'module', 'has_key', 'deepcopy', 'to_dict'}
In [2]: %timeit s = SON([('a',2)]); z = copy.deepcopy(s)
每个循环 14.3 µs ± 758 ns(7 次运行的平均值 ± 标准偏差,每次 100000 次循环)
In [3]: %timeit s = OrderedDict([('a',2)]); z = copy.deepcopy(s)
每个循环 7.54 µs ± 209 ns(平均值 ± 标准偏差,7 次运行,每次 100000 次循环)
In [4]: %timeit s = SON(data=[('a',2)]); z = json.dumps(s)
每个循环 11.5 µs ± 350 ns(7 次运行的平均值 ± 标准偏差,每次 100000 次循环)
In [5]: %timeit s = OrderedDict([('a',2)]); z = json.dumps(s)
每个循环 5.35 µs ± 192 ns(7 次运行的平均值 ± 标准偏差,每次 100000 次循环)
在回答您关于何时使用 SON 的问题时,
如果在早于 2.7 的 Python 版本中运行您的软件,请使用 SON。
如果您能提供帮助,请使用 collections 模块中的 OrderedDict。
你也可以使用dict,他们现在在Python 3.7订购