【发布时间】:2019-09-10 20:28:02
【问题描述】:
当我掉进那个兔子洞时,我已经阅读了几个小时试图了解会员测试和速度。我以为我已经得到了它,直到我运行了自己的小 timeit 测试
这是代码
range_ = range(20, -1, -1)
w = timeit.timeit('0 in {seq}'.format(seq=list(range_)))
x = timeit.timeit('0 in {seq}'.format(seq=tuple(range_)))
y = timeit.timeit('0 in {seq}'.format(seq=set(range_)))
z = timeit.timeit('0 in {seq}'.format(seq=frozenset(range_)))
print('list:', w)
print('tuple:', x)
print('set:', y)
print('frozenset:', z)
这是结果
列表:0.3762843
元组:0.38087859999999996
设置:0.06568490000000005
冻结集:1.5114070000000002
具有相同时间的列表和元组是有意义的。 我认为 set 和 freezeset 也会有相同的时间,但即使与列表相比它也非常慢?
将代码更改为以下代码仍然会给我类似的结果:
list_ = list(range(20, -1, -1))
tuple_ = tuple(range(20, -1, -1))
set_ = set(range(20, -1, -1))
frozenset_ = frozenset(range(20, -1, -1))
w = timeit.timeit('0 in {seq}'.format(seq=list_))
x = timeit.timeit('0 in {seq}'.format(seq=tuple_))
y = timeit.timeit('0 in {seq}'.format(seq=set_))
z = timeit.timeit('0 in {seq}'.format(seq=frozenset_))
【问题讨论】:
-
我猜是因为没有文字形式。如果您在没有创建的情况下进行测试会发生什么?
-
@jonrrsharpe 对不起,没有创作是什么意思?
-
您正在计时将范围转换为每种对象类型并查找值所需的时间,而不仅仅是计时查找
-
所以不是每次都创建一个新的frozenset(这也创建了一个集合;同样,没有文字形式),只需在循环中包含成员资格测试。跨度>
-
您的新代码仍然遇到与原始代码相同的问题,因为对于 freezeset 的情况,
'0 in {seq}'.format(seq=frozenset_)给出了'0 in frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20})',所以正如@jonrsharpe 所说,您正在构建一个集合,然后制作一个frozenset,并且只有then测试成员资格。
标签: python list set timeit frozenset