【发布时间】:2019-05-27 10:16:33
【问题描述】:
this question 之后的讨论让我感到疑惑,所以我决定运行一些测试并比较 set((x,y,z)) 与 {x,y,z} 在 Python 中创建集合的创建时间(我使用的是 Python 3.7)。
我使用time 和timeit 比较了这两种方法。
两者都与以下结果一致*:
test1 = """
my_set1 = set((1, 2, 3))
"""
print(timeit(test1))
结果:0.30240735499999993
test2 = """
my_set2 = {1,2,3}
"""
print(timeit(test2))
结果:0.10771795900000003
所以第二种方法比第一种方法快了近 3 倍。
这对我来说是一个非常令人惊讶的差异。
以这种方式优化集合文字在 set() 方法上的性能的幕后发生了什么?对于哪些情况,哪种建议是可取的?
* 注意:我只显示timeit 测试的结果,因为它们是在许多样本上取平均值的,因此可能更可靠,但测试时的结果与time 在两种情况下表现出相似的差异。
编辑:我知道this similar question,虽然它回答了我最初问题的某些方面,但并没有涵盖所有问题。问题中没有解决集合,并且由于 empty sets 在 python 中没有文字语法,我很好奇使用文字创建集合(如果有的话)与使用 set() 有何不同方法。另外,我想知道set((x,y,z) 中 tuple 参数 的处理是如何在幕后发生的,以及它对运行时可能产生的影响。
Coldspeed 的出色回答帮助解决了问题。
【问题讨论】:
-
是的,空集文字不存在。非空的可以,您会发现对另一个问题的回答在很大程度上适用于您的问题。让我们希望没有人问关于元组文字与
tuple(...)的问题。 -
@AndrasDeak 这两个问题肯定是相关的,但我不太确定它们是否重复。当 set() 比文字构造/理解语法更合适时,这个问题没有解决,这似乎是这个 XY 问题中的底层 X。我不会自己关闭它,但如果它关闭,我不会失眠。
-
这与
[] vs list()本质上是同一个问题。使文字语法更快的因素完全相同。 -
现代 Python 的欢乐时光:它有一个“空的
set文字”,独眼猴子运算符:{*()}。它使用带有空tuple的解包泛化(这是 CPython 上的单例,因此实际上不会发生tuple构造)来强加必要的上下文,因此 Python 看到正在构造的set,而不是dict。
标签: python python-3.x performance set