Python的set()和set([])之间的速度差异是多少?

时间:2013-01-28 19:49:50

标签: python performance set

这两个代码片段的速度差异很大吗?

1

x = set( i for i in data )

2

x = set( [ i for i in data ] )

我看到有人推荐set()而不是set([]);这只是风格问题吗?

2 个答案:

答案 0 :(得分:6)

表格

x = set(i for i in data)

是:

的简写
x = set((i for i in data))

这会创建一个generator expression,可以懒惰地进行评估。相比:

x = set([i for i in data])

在将其传递给set

之前创建整个列表

从性能的角度来看,生成器表达式允许在某些函数中出现短路(allany,并且因为您不需要存储额外的列表而占用更少的内存 - - 在某些情况下,这可能非常重要。

如果你真的要迭代整个可迭代的data,并且内存对你来说不是问题,我发现通常列表推导比等效的生成器表达式*快一点。

temp $ python -m timeit 'set(i for i in "xyzzfoobarbaz")'
100000 loops, best of 3: 3.55 usec per loop
temp $ python -m timeit 'set([i for i in "xyzzfoobarbaz"])'
100000 loops, best of 3: 3.42 usec per loop

请注意,如果您对速度感到好奇 - 您最快的赌注可能只是:

x = set(data)

证明:

temp $ python -m timeit 'set("xyzzfoobarbaz")'
1000000 loops, best of 3: 1.83 usec per loop

*仅限Cpython - 我不知道Jython或pypy如何优化这些东西。

答案 1 :(得分:3)

[]语法创建一个列表,该列表在创建集后立即被丢弃。所以你增加了程序的内存占用量。

生成器语法避免了这种情况。