BST遍历递归的速度快于

时间:2018-07-17 18:19:06

标签: python python-3.x

使用通过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内完成;再次,没什么大惊小怪的。我是否错误地将函数从递归转换为生成?

0 个答案:

没有答案