【发布时间】:2021-03-30 03:43:42
【问题描述】:
我有兴趣找到在 Python 中初始化空集的最快方法(我使用的是 3.8)。您不能将空集实例化为{},因为这会创建dict,因此通常建议使用set() 构造函数。前几天我注意到还有另一种实例化空集的方法:您可以将空元组 () 解压缩到集的 {...} 语法中,如下所示:{*()}。使用ipython 中的timeit 模块对此进行计时会得到以下结果:
%timeit {*()}
67.7 ns ± 1.68 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit set()
84.5 ns ± 2.57 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
我觉得这很奇怪 - 更优雅的 set() 构造函数相对于 {*()} 花费的时间多 25%。过去也有相同的观察结果,例如,[] vs. list() 和 {} vs. dict()。
%timeit []
17.8 ns ± 0.791 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
%timeit list()
81 ns ± 1.56 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit {}
18.6 ns ± 0.575 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)
%timeit dict()
98.6 ns ± 5.09 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
对于lists 和dicts,切换到原始语法{} 和[] 相当容易,但是我发现的集合显然不是那么干净。我很好奇对此的见解(一般而言)。
【问题讨论】:
-
这种性能差异是如此之小,以至于出于所有意图和目的,只需使用您认为最易读的内容。但这很可能是函数调用开销的结果,这对 Python 来说是相当大的。
-
总的来说我完全同意。在某些算法中,我可以看到非平凡的加速——但这更多是因为我对内部机制的好奇,而不是其他任何事情。
标签: python python-3.x set benchmarking python-internals