为什么在 python 中用 `{*()}` 初始化一个集合比 `set()` 更快?

cra*_*ael 5 python benchmarking set python-3.x python-internals

我有兴趣找到在 Python 中初始化空集的最快方法(我使用的是 3.8)。{}您不能像创建 那样实例化空集dict,因此通常建议使用set()构造函数。前几天我注意到还有另一种方法来实例化空集:您可以将空元组解压(){...}集合的语法中,如下所示:{*()}timeit使用in 中的模块对此进行计时ipython会得到以下结果:

\n
%timeit {*()}\n67.7 ns \xc2\xb1 1.68 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000000 loops each)\n\n%timeit set()\n84.5 ns \xc2\xb1 2.57 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n

我发现这很奇怪 -set()相对于{*()}. 过去也曾对例如[]vs.list(){}vs.进行过相同的观察dict()

\n
%timeit []\n17.8 ns \xc2\xb1 0.791 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000000 loops each)\n%timeit list()\n81 ns \xc2\xb1 1.56 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000000 loops each)\n\n%timeit {}\n18.6 ns \xc2\xb1 0.575 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000000 loops each)\n%timeit dict()\n98.6 ns \xc2\xb1 5.09 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n

{}切换到原始语法以及[]forlist和s相当容易dict,但我发现的集合显然不那么干净。我很好奇对此的见解(一般而言)。

\n

小智 1

set()是需要查找符号表的函数调用,而集合构造文字是“语法的产物”。当对等字节码进行查看时,这一点尤其明显。

请参阅此处以获得更深入的答案