我正在学习数据类和命名元组。我发现使用不同的Python特性创建对象时,它们的性能是不同的。
数据类:
In [1]: from dataclasses import dataclass
...:
...: @dataclass
...: class Position:
...: lon: float = 0.0
...: lat: float = 0.0
...:
In [2]: %timeit for _ in range(1000): Position(12.5, 345)
326 µs ± 34.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
普通类:
In [1]: class Position:
...:
...: def __init__(self, lon=0.0, lat=0.0):
...: self.lon = lon
...: self.lat = lat
...:
In [2]: %timeit for _ in range(1000): Position(12.5, 345)
248 µs ± 2.89 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
命名元组:
In [2]: Position = namedtuple("Position", ["lon","lat"], defaults=[0.0,0.0])
In [3]: %timeit for _ in range(1000): Position(12.5, 345)
286 µs ± 13.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
- Python 版本:3.7.3
- 操作系统:MacOS Mojave
所有实现具有相同的对象属性和默认值。
- 为什么这个趋势是时间(dataclass)> 时间(namedtuple)> 时间(普通类)?
- 每种实现都采取了什么措施来占用各自的时间?
- 哪种实现在什么场景下具有最佳性能?
这里,时间表示创建对象所需的时间。
__post_init__
,则不会生成对它的调用。 - Arne