我找到了一段运行速度很慢的代码(在我看来),并且会知道你们的想法。有问题的代码如下,应该是:
代码是:
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代码,但这不是罪魁祸首,它运行速度非常快,但是当你尝试获取这些结果时会出现缓慢的情况)
答案 0 :(得分:0)
fetchall()
读取所有结果,并将其返回临时列表
然后,您的run()
函数会将所有结果放入另一个列表中
然后,您的顶级代码会将这些值复制到另一个字典中。
您应该只获取所需的行(可以直接在光标上完成),并直接处理:
cur.execute("SELECT Field, Value ...")
for row in cur:
self.metrics[row[0].lower()] = row[1]
注意:这会在所有for
次迭代中分配SQL查询的开销;在数据库中花费的总时间不会改变。
此代码仅改善处理所有临时变量所花费的时间。