0

各リーフ ノードのルートまでのパス (すべてのノード) を取得する大きなツリーがあります。

私はete2を使ってこれをやろうとしていますが、ツリーが大きすぎて遅すぎるようです。

誰もがそうするためのより速い方法を提案できますか?

それは私がやっていることです:

    tr = Tree("anytree.nw", format=8)
    path_leaf_root = {} ## all paths from leafs to root
    root = tr.get_tree_root()
    for le in tr:
        if not path_leaf_root.has_key(le.name):
            path_leaf_root[le.name]=[]
        le_up = le
        while not le_up.name == root.name:
            le_up=le.up
            path_leaf_root[le.name].append(le_up.name)
4

1 に答える 1

1

ツリーを 1 回だけトラバースする次のアプローチを試すことができます。私のコンピューターでは、50,000 個のヒント ツリーを 0.24 秒で処理しました (結果を印刷または書き込むと、もう少し長くなります)。

from ete2 import Tree
t = Tree()
t.populate(50000)

import time
t1 = time.time()
current_path = [t]
for postorder, node in t.iter_prepostorder():
    if postorder:
        current_path.pop(-1)
    else:
        if not node.children:
            # print node.name, "path :", current_path
            pass
        else:
            current_path.append(node)
print time.time() - t1

# 0.242053985596
于 2014-10-24T06:09:30.357 に答える