【问题标题】:What is the difference between bson.son.SON and collections.OrderedDict?bson.son.SON 和 collections.OrderedDict 有什么区别?
【发布时间】:2018-12-23 15:41:52
【问题描述】:

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

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

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

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

【问题讨论】:

  • by docs SON provides an API similar to collections.OrderedDict from Python 2.7+. 更多详细信息,您可以使用dir 并阅读源代码。
  • 谢谢@BearBrown 文档没有提到区别。我想知道的是为什么我们有 SON 当 python 已经有 OrderedDict

标签: python mongodb python-2.7 pymongo


【解决方案1】:

目前,两者的细微差别在于 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订购

【讨论】:

    猜你喜欢
    • 2017-01-22
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多