为什么执行一行代码更改需要时间?
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)
这是我的第一个代码:
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)