Python 按s键与不按s键速度

Python 按s键与不按s键速度,python,performance,set,processing-efficiency,Python,Performance,Set,Processing Efficiency,我有以下代码: s = set([5,6,7,8]) if key in s: return True if key not in s: return False 在我看来,从理论上讲,它不应该在时间上有所不同,但我可能在幕后遗漏了一些东西 在处理时间或可读性方面,是否有任何理由选择其中一个 也许这是一个例子: “过早优化是万恶之源” 简短回答:没有,没有区别。是的,可能是过早的优化。 好的,我运行了这个测试: import random s = set([5,6,7,

我有以下代码:

s = set([5,6,7,8])

if key in s:
    return True

if key not in s:
    return False
在我看来,从理论上讲,它不应该在时间上有所不同,但我可能在幕后遗漏了一些东西

在处理时间或可读性方面,是否有任何理由选择其中一个

也许这是一个例子:

“过早优化是万恶之源”


简短回答:没有,没有区别。是的,可能是过早的优化。
好的,我运行了这个测试:

import random
s = set([5,6,7,8])
for _ in range(5000000):
    s.add(random.randint(-100000,100000000))

def test_in():
    count = 0
    for _ in range(50000):
        if random.randint(-100000,100000000) in s:
            count += 1
    print(count)

def test_not_in():
    count = 0
    for _ in range(50000):
        if random.randint(-100000,100000000) not in s:
            count += 1
    print(count)
当我对输出计时时:

%timeit test_in()
10 loops, best of 3: 83.4 ms per loop

%timeit test_not_in()
10 loops, best of 3: 78.7 ms per loop
但是,这一微小的差异似乎是计算组件的一个症状。平均有47500个“非移民”,但只有2500个“移民”。如果我将两项测试都更改为通过,例如:

def test_in():
    for _ in range(50000):
        if random.randint(-100000,100000000) in s:
            pass
结果几乎相同

%timeit test_in()
10 loops, best of 3: 77.4 ms per loop

%timeit test_not_in()
10 loops, best of 3: 78.7 ms per loop

在这种情况下,我的直觉让我失望。我原以为说
它不在集合中
会增加一些额外的处理时间。当我进一步考虑什么是哈希图时,很明显这是不可能的。 你应该看不出有什么不同。集合中的查找时间是恒定的。对条目进行散列,然后在散列映射中查找它。所有钥匙都在同一时间检查,in与not in应具有可比性。

在ipython会话中使用
timeit
运行简单的性能测试,以确认g.d.d.c的声明

def one(k, s):
    if k in s:
        return True     

def two(k, s):
    if k not in s:
        return False     

s = set(range(1, 100))

%timeit -r7 -n 10000000 one(50, s)
## 83.7 ns ± 0.874 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit -r7 -n 10000000 two(50, s)
## 86.1 ns ± 1.11 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

像这样的优化不会给你带来很多好处,正如评论中指出的那样,实际上会降低你发布错误修复/改进的速度。。。由于可读性差。对于这种低水平的性能提升,我建议研究or。

在处理时间方面,不。在清晰度方面,我认为两者都不适用:如果输入s:#做点什么,只需使用
。如果您确实需要将其放入函数中,您可以使用s中的返回键。但是您应该向我们展示一个实际的函数,因为在函数之外不能有
return
语句。顺便说一句,函数执行路径不以显式的
return
语句return
None
终止,这是错误的,因此您显示的两种不同形式在实际函数中不会有相同的效果。FWIW,在s
中编写类似于
return键的内容更像python,看起来您仍然在使用Python 2。您应该认真考虑迁移到Python 3,Python 2将在2020的某个时间到达它的正式生命结束。要查看字符串中的所有字符是否在一个集合中,您应该使用一个以C速度进行循环的集合方法,而不是Python循环。例如,
s=set('abcdefg');打印(s.issuperset(‘笼状’)