bson.son.SON 主要用于 pymongo 中,用于获取有序映射(dict)。
但是python已经在 collections.OrderedDict() 中有有序的字典
我已经阅读了 bson.son.SON 的文档。它确实说 SON 与 OrderedDict 相似,但没有提到区别。
那么区别是什么呢?我们什么时候应该使用 SON,什么时候应该使用 OrderedDict?
bson.son.SON 主要用于 pymongo 中,用于获取有序映射(dict)。
但是python已经在 collections.OrderedDict() 中有有序的字典
我已经阅读了 bson.son.SON 的文档。它确实说 SON 与 OrderedDict 相似,但没有提到区别。
那么区别是什么呢?我们什么时候应该使用 SON,什么时候应该使用 OrderedDict?
目前,两者的细微差别是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
.
如果您能提供帮助,请OrderedDict
从collections
模块中使用。您也可以使用dict
,它们现在在Python 3.7中订购