我正在filter
一个可交互的设备上运行,并希望将结果存储在一个序列中(我需要一个序列以便我可以使用random.choice
它)。我注意到从过滤器对象创建集合比创建列表或元组快得多。这是为什么?我首先认为过滤器类型是集合的子类型,这可以解释这一点,但该函数实际上与生成器表达式相同,因此它在内部不能真正成为集合。filter
我运行了以下测试来检查速度:
import time
def test ( n, seq ):
for method in ( set, list, tuple ):
t = time.time()
for i in range( n ):
method( seq )
print( method.__name__, ( time.time() - t ) )
someFilter = filter( lambda x: x % 3 == 0, range( 1000 ) )
test( 10000000, someFilter )
结果清楚地说明了使用集合:
set 1.9240000247955322
list 8.82200002670288
tuple 7.031999826431274
那么为什么从过滤器创建一个集合的速度如此之快呢?它通常不应该像从序列中创建一个集合一样长,其中每个元素都必须被散列吗?或者它是否以某种方式从内部过滤器表示中得到了提升?
相比之下,在对range
表达式运行测试时,所需时间大约是和set
的两倍(两者的速度几乎相同)。list
tuple
编辑:
Sven 的回答是完全正确的,但为了完整性,更新的测试将在实际过滤器上运行:
import time
def testFilter ( n, test, rangeSize ):
for method in ( set, list, tuple ):
t = time.time()
for i in range( n ):
method( filter( test, range( rangeSize ) ) )
print( method.__name__, ( time.time() - t ) )
testFilter( 100000, lambda x: x % 3 == 0, 1000 )
结果实际上显示了什么更有意义,list
并且tuple
两者都是最快的,尽管 set 并不是真的很慢,所以使用什么不会有任何区别:
set 27.868000030517578
list 27.131999969482422
tuple 27.138000011444092