这两个代码片段的速度是否有很大差异?
1.
x = set( i for i in data )
相对:
2.
x = set( [ i for i in data ] )
我见过人们推荐set()
而不是set([])
; 这只是风格问题吗?
这两个代码片段的速度是否有很大差异?
1.
x = set( i for i in data )
相对:
2.
x = set( [ i for i in data ] )
我见过人们推荐set()
而不是set([])
; 这只是风格问题吗?
表格
x = set(i for i in data)
是以下的简写:
x = set((i for i in data))
这将创建一个生成器表达式,该表达式会延迟计算。相比:
x = set([i for i in data])
在将其传递给之前创建一个完整的列表set
从性能的角度来看,生成器表达式允许在某些函数中短路(all
并且any
想到)并且占用更少的内存,因为您不需要存储额外的列表——在某些情况下,这可能非常重要。
如果您实际上要遍历整个 iterable 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 如何优化这些东西。
该[]
语法创建一个列表,该列表在创建集合后立即被丢弃。所以你正在增加程序的内存占用。
生成器语法避免了这种情况。