Python 这个递归可以写得更有效吗?

Python 这个递归可以写得更有效吗?,python,google-app-engine,recursion,python-2.7,app-engine-ndb,Python,Google App Engine,Recursion,Python 2.7,App Engine Ndb,我有一个层次结构组织,它是一个树,其中节点是一个子节点,如果父节点赞助子节点。似乎我可以用这个代码遍历树 def get_team(self, person, team): firstline = User.query(User.sponsor == person.key).fetch(99999999) if firstline: for person in firstline: team.append(person)

我有一个层次结构组织,它是一个树,其中节点是一个子节点,如果父节点赞助子节点。似乎我可以用这个代码遍历树

def get_team(self, person, team):
    firstline = User.query(User.sponsor == person.key).fetch(99999999)
    if firstline:
        for person in firstline:
            team.append(person)
            newdownline = self.downline(person, team)        
    return team
使用上述方法,我可以通过以下方式获得用户的组织:

downline=user.get\u团队(用户,[])

但是有没有一种更有效的方法,因为我必须对一个请求执行多次这样的操作,而大量的递归可能是无效的?或者代码可以正常运行,因为它可以正确地遍历树?在我的第一个版本中,我使用了三个变量,我发现我可以将代码重新排列为两个变量,而不是这个:

def downline(self, person, team, teamlist):
    firstline = User.query(User.sponsor == person.key).fetch(99999999)
    if firstline:
        for person in firstline:
            teamlist.append(person)
            newdownline = self.downline(person, team, teamlist)        
            team.append(newdownline)
    return teamlist 
我发现teamlist变量实际上并不需要,所以我删除了它。我做这件事的方式是首先使用一个变量太多:


people=user.downline(user,[],[])

是的,有一种更有效的方法,这取决于您的计算权衡

您目前正在对树进行深度优先遍历,这是一种非常好的方法。您可以通过缓存结果而牺牲一些RAM使用来提高速度,因此:

if person.id in downline_cache:
      team.append(downline_cache[person.id])
else:
      downline_cache[person.id] = results
      team.append(results)
如果树相当小,您可以预先缓存整个内容,每个线程缓存一次。这比您正在做的要占用更多的RAM,但比每次您关心结果时进行深度优先遍历要快得多。这在很大程度上取决于您的使用模式和存储的数据量


如果使用缓存,则必须确保有某种方法来处理底层数据的更改,包括超时和“最终正确”类型保证,或者跟踪何时以及如何擦除缓存或缓存元素。

递归在哪里?你是说在第一行上的迭代吗?newdownline=self.downline(个人、团队、团队列表您可以通过删除
person
参数,与
self.key
进行比较,并在循环中调用
person.downline
来优化可读性。您测量过程序的速度吗?您确定递归是瓶颈吗?我很困惑-实际的代码是什么,以前的版本是什么?为什么不使用
person.get_team
而不是定义为
downline=user.get_team
self.downline
?感谢您的评论。我不能使用person.get_team-这就是我试图实现的。团队通过赞助商属性连接,父节点赞助子节点和赞助商sor属性位于子对象中,因此我正在尝试重新遍历整个树。感谢您提供的非常有趣的答案。