如何在没有循环的情况下一次获取一个类的多个值?

时间:2010-06-21 12:41:38

标签: python google-app-engine

我知道这很简单,但我无法理解这一点,我正在获取给定链接名称的所有实例但我想调用它们的所有值(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个表格中取出一些项目变得缓慢?如何加快速度呢?

3 个答案:

答案 0 :(得分:3)

您的应用不再拨打任何电话了。执行.fetch()操作时会出现唯一的RPC。任何缓慢的来源都可能在其他地方。

答案 1 :(得分:1)

如果您担心RPC在每次循环迭代中都会触发,我认为不会。你正在使用fetch来急切加载你的实体,而你的模型没有引用属性,所以你应该做两个查询,而且没有得到。

要根据经验跟踪RPC音量和时间,请使用Guido的Appstats framework。这将显示每个脚本的总运行时间,以及RPC执行消耗的大小。您也可以在循环之前和之后放置logging.debug以确认它们运行得很快。

答案 2 :(得分:0)

如果你想摆脱循环,你可以使用

adic = zip([itema.user for itema in aa],[itema.rating2 for itema in aa])
bdic = zip([itema.user for itema in bb],[itema.rating2 for itema in bb])

这不一定会使您的代码更快。如果您只是想提高效果,请查看psyco包,或查看here.