相关疑难解决方法(0)

是否在Python 3.6+中订购了字典?

字典在Python 3.6中排序(至少在CPython实现下),与之前的版本不同.这似乎是一个重大变化,但它只是文档中的一小段.它被描述为CPython实现细节而不是语言特性,但也暗示这可能成为未来的标准.

在保留元素顺序的同时,新字典实现如何比旧字典实现更好?

以下是文档中的文字:

dict()现在使用PyPy开创的"紧凑"表示.与Python 3.5相比,新dict()的内存使用量减少了20%到25%.PEP 468(在函数中保留**kwargs的顺序.)由此实现.这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖(这可能会在未来发生变化,但是在更改语言规范之前,希望在几种版本的语言中使用这个新的dict实现为所有当前和未来的Python实现强制命令保留语义;这也有助于保持与随机迭代顺序仍然有效的语言的旧版本的向后兼容性,例如Python 3.5).(由INADA Naoki在issue 27350中提供.最初由Raymond Hettinger提出的想法.)

2017年12月更新:Python 3.7 保证dict保留插入顺序

python dictionary python-3.x python-internals python-3.6

386
推荐指数
5
解决办法
8万
查看次数

为什么在Python 3中__dict__实例的大小要小得多?

在Python中,与包含该类相同属性的字典相比,为类实例创建的字典很小:

import sys

class Foo(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b

f = Foo(20, 30)
Run Code Online (Sandbox Code Playgroud)

使用Python 3.5.2时,以下调用getsizeof生成:

>>> sys.getsizeof(vars(f))  # vars gets obj.__dict__
96 
>>> sys.getsizeof(dict(vars(f))
288
Run Code Online (Sandbox Code Playgroud)

288 - 96 = 192 字节已保存!

但是,另一方面,使用Python 2.7.12,相同的调用返回:

>>> sys.getsizeof(vars(f))
280
>>> sys.getsizeof(dict(vars(f)))
280
Run Code Online (Sandbox Code Playgroud)

0 保存的字节数

在这两种情况下,词典显然具有完全相同的内容:

>>> vars(f) == dict(vars(f))
True
Run Code Online (Sandbox Code Playgroud)

所以这不是一个因素.此外,这也仅适用于Python 3.

那么,这里发生了什么?为什么__dict__Python 3中实例的大小如此之小?

python dictionary class python-3.x python-internals

16
推荐指数
1
解决办法
942
查看次数