1

bson.son.SON 主要用于 pymongo 中,用于获取有序映射(dict)。

但是python已经在 collections.OrderedDict() 中有有序的字典

我已经阅读了 bson.son.SON 的文档。它确实说 SON 与 OrderedDict 相似,但没有提到区别。

那么区别是什么呢?我们什么时候应该使用 SON,什么时候应该使用 OrderedDict?

4

1 回答 1

2

目前,两者的细微差别是bson.son.SON仍然向后兼容 Python 2.7 和旧版本SON此外,序列化速度快于 2018 年的论点也OrderedDict不再正确。

son模块于2009 年 1 月 8 日添加

collections.OrderedDict(PEP-372) 于2009 年 3 月 2 日在 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','模块','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 的问题时,如果在 Python 版本早于2.7.

如果您能提供帮助,请OrderedDictcollections模块中使用。您也可以使用dict,它们现在在Python 3.7中订购

于 2018-07-19T06:53:58.133 回答