首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用集合文字更快地设置包含

用集合文字更快地设置包含
EN

Stack Overflow用户
提问于 2021-10-20 16:59:53
回答 1查看 122关注 0票数 3

在下面的时间里,10_000_000会检查10是否在{0, ..., 9}中。

在第一个检查中,我使用一个中间变量,在第二个检查中,我使用一个文字变量。

代码语言:javascript
复制
import timeit

x = 10
s = set(range(x))
number = 10 ** 7

stmt = f'my_set = {s} ; {x} in my_set'
print(f'eval "{stmt}"')
print(timeit.timeit(stmt=stmt, number=number))

stmt = f'{x} in {s}'
print(f'eval "{stmt}"')
print(timeit.timeit(stmt=stmt, number=number))

输出:

代码语言:javascript
复制
eval "my_set = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} ; 10 in my_set"
1.2576093
eval "10 in {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}"
0.20336140000000036

第二个怎么会更快(大约是5-6倍)?Python是否执行了一些运行时优化,例如,如果对文字进行了包含检查?或者可能是由于垃圾收集(因为它是一个字面上的python垃圾,所以在使用后就会收集它)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-20 17:04:25

你不是在测试同样的两件事--在第一次测试中,除了成员资格测试之外,你还需要对两个任务和查找进行计时:

代码语言:javascript
复制
In [1]: import dis
   ...: x = 10
   ...: s = set(range(x))

In [2]: dis.dis("x in s")
  1        0 LOAD_NAME                0 (x)
           2 LOAD_NAME                1 (s)
           4 CONTAINS_OP              0
           6 RETURN_VALUE

In [3]: dis.dis("my_set = s; x in my_set")
  1        0 LOAD_NAME                0 (s)
           2 STORE_NAME               1 (my_set)
           4 LOAD_NAME                2 (x)
           6 LOAD_NAME                1 (my_set)
           8 CONTAINS_OP              0
          10 POP_TOP
          12 LOAD_CONST               0 (None)
          14 RETURN_VALUE

# By request
In [4]: dis.dis("s = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 10 in s")
  1        0 BUILD_SET                0
           2 LOAD_CONST               0 (frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}))
           4 SET_UPDATE               1
           6 STORE_NAME               0 (s)
           8 LOAD_CONST               1 (10)
          10 LOAD_NAME                0 (s)
          12 CONTAINS_OP              0
          14 POP_TOP
          16 LOAD_CONST               2 (None)
          18 RETURN_VALUE

使用文本和x in s的实际区别是后者需要在全局中执行查找,也就是说,区别是LOAD_NAMELOAD_CONST

代码语言:javascript
复制
In [5]: dis.dis("10 in {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}")
  1        0 LOAD_CONST               0 (10)
           2 LOAD_CONST               1 (frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}))
           4 CONTAINS_OP              0
           6 RETURN_VALUE

时代:

代码语言:javascript
复制
In [6]: %timeit x in s
28.5 ns ± 0.792 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [7]: %timeit 10 in {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
20.3 ns ± 0.384 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69650210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档