【发布时间】:2019-02-13 05:16:05
【问题描述】:
我正在使用 Python 3.6 和来自 ericvsmith 的 dataclasses backport 包。
似乎调用dataclasses.asdict(my_dataclass) 比调用my_dataclass.__dict__ 慢约10 倍:
In [172]: @dataclass
...: class MyDataClass:
...: a: int
...: b: int
...: c: str
...:
In [173]: %%time
...: _ = [MyDataClass(1, 2, "A" * 1000).__dict__ for _ in range(1_000_000)]
...:
CPU times: user 631 ms, sys: 249 ms, total: 880 ms
Wall time: 880 ms
In [175]: %%time
...: _ = [dataclasses.asdict(MyDataClass(1, 2, "A" * 1000)) for _ in range(1_000_000)]
...:
CPU times: user 11.3 s, sys: 328 ms, total: 11.6 s
Wall time: 11.7 s
这是预期的行为吗?在什么情况下我必须使用dataclasses.asdict(obj) 而不是obj.__dict__?
编辑:使用__dict__.copy() 并没有太大区别:
In [176]: %%time
...: _ = [MyDataClass(1, 2, "A" * 1000).__dict__.copy() for _ in range(1_000_000)]
...:
CPU times: user 922 ms, sys: 48 ms, total: 970 ms
Wall time: 970 ms
【问题讨论】:
-
好吧,对于初学者来说,
asdict将创建并返回 new dict object,并递归并将任何其他数据类实例转换为 dicts,而__dict__只是返回对对象命名空间的引用,你可能不想改变的东西,例如...