我知道这很简单,但我无法理解这一点,我正在获取给定链接名称的所有实例但我想调用它们的所有值(rating2)来执行计算,我意识到这是在循环中我相信这每次都会进行一次单独的调用,(慢)只需要2秒就可以完成LinkRating2类的100个实例。那么如何在没有循环的情况下调用给定链接名的所有rating2值并填充字典?或者坦率地说,让这段代码更快?
class LinkRating2(db.Model):
user = db.StringProperty()
link = db.StringProperty()
rating2 = db.FloatProperty()
def sim_distance(link1,link2,tabl):
# Get the list of shared_items
si={}
query = tabl.all()
query2 = tabl.all()
a = query.filter('link = ', link1)
b = query2.filter('link = ', link2)
adic ={}
bdic= {}
##populate dics
aa = a.fetch(10000)
bb = b.fetch(10000)
for itema in aa:
adic[itema.user]=itema.rating2
for itemb in bb:
bdic[itemb.user]=itemb.rating2
好吧我调试并意识到循环基本上花了0秒,我的所有时间都在查询和获取行中,我只有一个包含100个项目的表,它需要2秒!!!!!如何从100个表格中取出一些项目变得缓慢?如何加快速度呢?
答案 0 :(得分:3)
您的应用不再拨打任何电话了。执行.fetch()操作时会出现唯一的RPC。任何缓慢的来源都可能在其他地方。
答案 1 :(得分:1)
如果您担心RPC在每次循环迭代中都会触发,我认为不会。你正在使用fetch来急切加载你的实体,而你的模型没有引用属性,所以你应该做两个查询,而且没有得到。
要根据经验跟踪RPC音量和时间,请使用Guido的Appstats framework。这将显示每个脚本的总运行时间,以及RPC执行消耗的大小。您也可以在循环之前和之后放置logging.debug
以确认它们运行得很快。
答案 2 :(得分:0)