我有一个分层组织,如果父母赞助孩子,那么节点就是一个树。看来我可以用这段代码遍历树
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_team(user, [])
但是,有一种更有效的方法,因为我必须多次为单个请求执行此操作并且很多递归可能无效吗?或者代码是否正常,因为它可以正确遍历树?在我的第一个版本中,我使用了三个变量,我发现我可以将代码重新排列为仅两个变量而不是:
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
我发现团队列表变量并不是真的需要,所以我删除了它。我这样做的方式首先是一个变量太多:
people = user.downline(user, [], [])
答案 0 :(得分:1)
是的,有一种更有效的方法,取决于您的计算权衡。
您目前正在对树进行深度优先遍历,这是一种非常精细的方法。您可以通过以某些RAM使用为代价来缓存结果来增加一些速度,所以:
if person.id in downline_cache:
team.append(downline_cache[person.id])
else:
downline_cache[person.id] = results
team.append(results)
如果树相当小,你可以预先缓存整个事情,每个线程一次。这需要比你正在做的更多的RAM,但是每次你关心结果时都要比深度优先遍历快得多。很大程度上取决于您的使用模式和您要存储的数据量。
如果使用缓存,则必须确保有某种方法来处理基础数据更改,或者使用超时和“最终正确”类型保证,或者跟踪何时以及如何擦除缓存,或者缓存的元素。