3
我已經實現了python中的樹遍歷遍歷,但發現我的遞歸版本比迭代版本更快。樹遍歷,遞歸比python中的迭代更快嗎?
代碼如下:
from __future__ import print_function
import time
class Tree():
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def build_tree(string):
nodes = [0] + [Tree(s) for s in string]
for i in range(2, len(nodes)):
p = i/2
if i%2 == 0:
nodes[p].left = nodes[i]
else:
nodes[p].right = nodes[i]
return nodes[1]
def preorder(tree):
if tree:
# print(tree.value,end='')
preorder(tree.left)
preorder(tree.right)
def preorder2(tree):
t = tree
s = []
while t or s:
while t:
# print(t.value,end='')
s.append(t)
t = t.left
if s:
t = s.pop()
t = t.right
def main():
tree = build_tree('abcdefghi'*1000)
t = time.time()
for _ in range(100):
preorder(tree)
print(time.time() - t)
t = time.time()
for _ in range(100):
preorder2(tree)
print(time.time() - t)
if __name__ == '__main__':
main()
結果:
0.751042842865
1.0220580101
這意味着遞歸版本爲約25%的速度。 我搜索了很多,大家都說遞歸應該慢一點,我只是想知道爲什麼它不是我的代碼中的情況?
您比較二進制查找與一個完整的掃描。不是遞歸與循環。 – RickyA
您的迭代算法包含一些低效率,此外,它在很大程度上取決於遞歸/迭代更快的一些因素。 –
您的迭代版本具有冗餘條件檢查。在這個[gist](https://gist.github.com/selcukcihan/2a058e423aa09803e17953b79db63664#file-gistfile1-txt)中看到一個更加精確的版本。然而,我也在這裏感到困惑,因爲精煉版本也有點慢。什麼會導致遞歸版本更快?它是像'pop'還是'append'這樣的方法調用?兩次遍歷的輸出都是相同的,所以它不是導致性能差異的遍歷順序。 –