<p>我认为不是递归本身伤害了你,而是每一步都有大量非常广泛的操作(覆盖所有元素)。考虑:</p>
<pre><code>init_vector[np.where(self.ids==newRootElement)[0]] = 1
</code></pre>
<p>它对所有元素运行扫描,计算每个匹配元素的索引,然后只使用第一个元素的索引。这个特定的操作可以作为列表、元组和数组的方法索引,而且速度更快。如果id是唯一的,init_vector就是IDs==newRootElement。在</p>
^{pr2}$
<p>再次对每个元素进行线性扫描,然后对整个数组进行缩减,以检查是否存在匹配项。将<a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.any.html#numpy.any" rel="nofollow noreferrer">any</a>用于这种类型的操作,但我们再次重申,我们甚至不需要对所有元素进行检查-“如果newRootElement不在自父项_ID“可以,但这不是必需的,因为在空列表上执行for循环是完全有效的。在</p>
<p>最后一个循环是:</p>
<pre><code>for sucs in self.ids[self.id_successors(newRootElement)==1]:
</code></pre>
<p>这一次,重复一个id\u后续调用,然后不必要地将结果与1进行比较。只有在这之后才进行递归,确保对每个分支重复上面的所有操作(对于不同的newRootElement)。在</p>
<p>整个代码是对单向树的反向遍历。我们有父母,需要孩子。如果我们要做像numpy这样的广泛的操作,我们最好让它们有价值——因此我们关心的唯一操作就是为每个家长建立一个子列表。一次迭代并不难做到:</p>
<pre><code>import collections
children=collections.defaultdict(list)
for i,p in zip(ids,parent_ids):
children[p].append(i)
def subtree(i):
return i, map(subtree, children[i])
</code></pre>
<p>您需要的确切结构将取决于更多的因素,例如树的更改频率、大小、分支数量以及需要请求的子树的大小和数量。例如,上面的dictionary+list结构的内存效率并不高。您的示例也进行了排序,这将使操作更加容易。在</p>