트리는 잘 연구 된 구조라는 것을 알고 있습니다.Python : 트리 평가자 최적화
나는 무작위로 많은 수식 트리를 생성 한 다음 적합성 속성으로 정렬하고 선택하는 프로그램을 작성하고 있습니다.
나는 'eval'이 평가할 수있는 문자열로 트리를 변환하는 클래스 MakeTreeInOrder()를 가지고있다.
하지만 여러 번 호출되며 시간에 맞게 최적화되어야합니다.
아래에는 테스트로 사용할 연속 번호를 추가하는 트리가 작성됩니다.
트리 구조에있는 표현식을 평가하는 데 최적화 된 방법이 있는지 궁금합니다. 나는 그것을 생각했다.
꽤 많이 사용되고 일부는 이미 이렇게했다.
import itertools
from collections import namedtuple
#Further developing Torsten Marek's second suggestion
KS = itertools.count()
Node = namedtuple("Node", ["cargo", "args"])
def build_nodes (depth = 5):
if (depth <= 0):
this_node = Node((str(KS.next())), [None, None])
return this_node
else:
this_node = Node('+', [])
this_node.args.extend(
build_nodes(depth = depth - (i + 1))
for i in range(2))
return this_node
다음 코드는 훨씬 빠르게 만들 수 있다고 생각하는 코드입니다. 그리고 저는 몇 가지 아이디어를 원했습니다.
class MakeTreeInOrder(object):
def __init__(self, node):
object.__init__(self)
self.node = node
self.str = ''
def makeit(self, nnode = ''):
if nnode == '':
nnode = self.node
if nnode == None: return
self.str +='('
self.makeit(nnode.args[0])
self.str += nnode.cargo
self.makeit(nnode.args[1])
self.str+=')'
return self.str
def Main():
this_tree = build_nodes()
expression_generator = MakeTreeInOrder(this_tree)
this_expression = expression_generator.makeit()
print this_expression
print eval(this_expression)
if __name__ == '__main__':
rresult = Main()
그럼 ** 당신의 질문 **이 무엇입니까? –
속도를 위해 MakeTreeInOrder를 최적화하고 싶습니다. 어떻게 든 그것을 인라인으로 넣는 것은 좋을 것이지만, 재귀에는 함수가 필요하다고 생각합니다. 클래스 대신 함수를 만들려고했지만 'str'을 유지할 수 없습니다 (올바른 단어 인 경우) –
함수가 클래스와 메서드보다 일반적으로 빠릅니까? –