Python代码运行速度太慢(SQLITE)

时间:2015-06-30 08:37:23

标签: python sqlite optimization

我找到了一段运行速度很慢的代码(在我看来),并且会知道你们的想法。有问题的代码如下,应该是:

  • 查询数据库并获取2个字段,字段及其值
  • 使用值
  • 填充对象字典

代码是:

query = "SELECT Field, Value FROM metrics " \
        "WHERE Status NOT LIKE '%ERROR%' AND Symbol LIKE '{0}'".format(self.symbol)
query = self.db.run(query, True)
if query is not None:
    for each in query:
        self.metrics[each[0].lower()] = each[1]

使用我创建的db类运行查询非常简单:

def run(self, query, onerrorkeeprunning=False):
    # Run query provided and return result
    try:
        con = lite.connect(self.db)

    cur = con.cursor()
    cur.execute(query)
    con.commit()

    runsql = cur.fetchall()
    data = []
    for rows in runsql:
        line = []
        for element in rows:
            line.append(element)
        data.append(line)
    return data

except lite.Error, e:
    if onerrorkeeprunning is True:
            if con:
                con.close()
            return
    else:
        print 'Error %s:' % e.args[0]
        sys.exit(1)

finally:

    if con:
        con.close()

我知道有很多方法可以编写这些代码而且我试图保持简单,但是对于24个字段,这需要0.03秒,所以如果我有1000个元素是30秒而且我发现它有点太长了!

编辑:在进一步审核时,runsql = cur.fetchall()是最需要运行的行。

非常感谢任何帮助。

第二次编辑:进一步在线查看,我发现问题在于fetchall()commant而不是我的查询或数据库的初始化。有没有人能够改善结果提取的性能? (有些人提到改变SQL代码,但这不是罪魁祸首,它运行速度非常快,但是当你尝试获取这些结果时会出现缓慢的情况)

1 个答案:

答案 0 :(得分:0)

fetchall()读取所有结果,并将其返回临时列表 然后,您的run()函数会将所有结果放入另一个列表中 然后,您的顶级代码会将这些值复制到另一个字典中。

您应该只获取所需的行(可以直接在光标上完成),并直接处理:

cur.execute("SELECT Field, Value ...")
for row in cur:
    self.metrics[row[0].lower()] = row[1]

注意:这会在所有for次迭代中分配SQL查询的开销;在数据库中花费的总时间不会改变。 此代码仅改善处理所有临时变量所花费的时间。