編寫斐波那契函數時遇到了這個問題。爲了使它更快,我使用名爲cache的字典來存儲已經計算的數字。所以我寫了爲什麼Python語句'如果東西是None'比'如果不是東西'要快得多?
def fib(n, cache=None):
if not cache:
cache = {}
if n in cache:
return cache[n]
if n==0 or n==1:
return 1
else:
cache[n] = fib(n-1, cache) + fib(n-2, cache)
return cache[n]
def fib_run(n):
start = time.time()
fib(n)
end = time.time()
print("fib_run cost: {}".format(end-start))
我呼籲fib_run(30)
,輸出爲fib_run cost: 0.8419640064239502
,它只是作爲不帶緩存的功能緩慢。 但是,當我在功能fib2
中將if not cache:
更改爲if cache is None:
時,它的工作速度更快。
def fib2(n, cache=None):
if cache is None:
cache = {}
if n in cache:
return cache[n]
if n==0 or n==1:
return 1
else:
cache[n] = fib2(n-1, cache) + fib2(n-2, cache)
return cache[n]
def fib2_run(n):
start = time.time()
fib2(n)
end = time.time()
print("fib_run cost: {}".format(end-start))
>>> fib2_run(30)
fib2_run cost: 2.6226043701171875e-05
我想知道爲什麼兩種方法之間存在如此巨大的差異(我認爲它們在早期是一樣的)。謝謝。
'緩存None'是身份檢查。 'not cache'是字典的空白檢查。這些是引擎蓋下的兩種不同的操作。 –
你的意思是空虛檢查花費更多的時間?你能告訴我爲什麼嗎? –