使用通过HyperRectangles搜索的KD-Tree,可以很容易地对其细节进行Google搜索,因此我将其留给您自己感兴趣。当我遇到yield from
语法时,我正在搜索与优化区域查询的一部分有关的内容;因此突出显示了它在尾部递归函数上的使用,因为Python没有对它们进行优化。
我使用这种语法实现了我的两个遍历函数(其中一个是嵌套的)以进行一些测试,结果证明它实际上比递归方法要慢,尽管我不确定为什么(但是我相信这样做)在进行一些快速测试之后,就可以使用嵌套函数了。
来电者:
def search(node, point, eps):
region = make_region(point, eps)
return [found
for found
in range_search(node, region)
if sqdist(found, point) <= (eps ** 2)
]
外部(递归):
def range_search(node, region, found=None):
if found is None:
found = []
if node.is_leaf():
found.append(node.value)
else:
if region.contains(node.bounds):
dissolve(node, found)
elif region.intersects(node.bounds):
if node.left:
range_search(node.left, region, found)
if node.right:
range_search(node.right, region, found)
return found
内部(递归):
def dissolve(node, found):
if not node.is_leaf():
if node.left:
dissolve(node.left, found)
if node.right:
dissolve(node.right, found)
else:
found.append(node.value)
外部(发电机):
def range_search(node, region):
if node.is_leaf():
yield node.value
else:
if region.contains(node.bounds):
yield from dissolve(node)
elif region.intersects(node.bounds):
yield from range_search(node.left, region) if node.left else ()
yield from range_search(node.right, region) if node.right else ()
内部(发电机)
def dissolve(node):
if node:
yield from dissolve(node.left) if node.left else ()
if node.is_leaf():
yield node.value
yield from dissolve(node.right) if node.right else ()
时间相距甚远,但是,我一直认为,如果Python没有针对它进行优化,而是针对诸如生成器之类的迭代,则递归的速度会变慢。
例如,通过search()
方法递归运行20K点,程序将在2.18s内完成,而生成器在2.5s内完成;再次,没什么大惊小怪的。我是否错误地将函数从递归转换为生成?