为什么执行一行代码更改需要时间?

Why time taken to execute code changes with one line?

这是我的第一个代码:

def isAnagram(s,t):
    if len(s)!=len(t):
        return False
    for i in s:
        if s.count(i)!=t.count(i):
            return False
    return True

这是我的第二个代码:

def isAnagram(s,t):
    if len(s)!=len(t):
        return False
    for i in set(s):
        if s.count(i)!=t.count(i):
            return False
    return True

这是我的第三个代码:

def isAnagram(s,t):
    if len(s)!=len(t):
        return False
    for i in set(s[:]):
        if s.count(i)!=t.count(i):
            return False
    return True

我不明白为什么将第 4 行中的 s 替换为 set(s) 执行时间更短,而替换为 set(s[:]) 甚至比其他两个语句更好。

谁能帮我知道为什么会这样?

执行%timeit后我发现@Barmar的观察是正确的。您应该对这些功能执行 timeit。 set(s[:])set(s)

对于这 4 个函数:

def isAnagram(s,t):
    if len(s)!=len(t):
        return False
    a = set(s)
    for i in a:
        if s.count(i)!=t.count(i):
            return False
    return True

def isAnagram1(s,t):
    if len(s)!=len(t):
        return False
    a = set(s[:])
    for i in a:
        if s.count(i)!=t.count(i):
            return False
    return True

def isAnagram2(s,t):
    if len(s)!=len(t):
        return False
    for i in set(s):
        if s.count(i)!=t.count(i):
            return False
    return True

def isAnagram3(s,t):
    if len(s)!=len(t):
        return False
    for i in set(s[:]):
        if s.count(i)!=t.count(i):
            return False
    return True

a = "abcde"
b = "edabc"
%timeit isAnagram(a, b)
%timeit isAnagram1(a,b)
%timeit isAnagram2(a,b)
%timeit isAnagram3(a,b)

我得到以下输出:

958 ns ± 5.37 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
1.01 µs ± 17.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
967 ns ± 9.61 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
987 ns ± 2.54 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

异或运算符也是检查变位词最快的方法。

def isAnagramXOR(s, t):
    res = 0
    for i,j in zip(s, t):
        res ^= ord(i) ^ ord(j)
    return not bool(res)

表现:667 ns ± 2.54 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)