我编写了一个Python代码,它迭代地从sqlite数据库中读取数据,对其进行一些计算,并将结果作为新列写回数据库,依此类推。但是,通过更新列来写入数据库的部分感觉会随着时间的推移变得越来越慢。有没有其他方法可以做同样的事情但速度更快?
我的代码的相关部分如下。在代码的这一部分中,创建了两个新列column_I1_和column_I2_,每个列以迭代编号结束,如column_I1_1,column_I2_1,然后新结果将从相应列表写入这些列。问题是,考虑到大量的迭代和计算的耗时性,加上大量的行(这里由num值定义,大约11000行),这个工作太慢......
有没有其他方法可以执行此操作而不是使用更新?因为我认为要进行更新,每次添加新值时都必须复制该列,这会导致速度变慢。我过去常常使用Excel,速度要快得多,但由于电子表格有256列限制,我不得不切换到数据库。
cur.execute("alter table C add column_I1_%d integer"%iter) #makes a new column indexed by iteration number
con.commit()
for e in range(0,num): # num is a given number as input
cur.execute("UPDATE C SET column_I1_%d=? WHERE Id=%d"%(iter,e+1),(w[e],)) # w is a list containing some results
con.commit()
#
cur.execute("alter table C add column_I2_%d integer"%iter)
con.commit()
for f in range(num,(2*num)):
cur.execute("UPDATE C SET column_I2_%d=? WHERE Id=%d"%(iter,f-num+1),(w[f],))
con.commit()
.....
非常感谢您的评论。另外,我是一个相对Python的新手,所以请放轻松我吧! :)
答案 0 :(得分:2)
要加快Id
列的查找速度,请在其上创建索引:
cur.execute("CREATE INDEX MyLittleIndex ON C(Id)");
或者,如果Id
列中的值是唯一的,请将此列声明为主键(自动创建索引):
cur.execute("CREATE TABLE C(Id PRIMARY KEY)");
如果值是整数,则将此列声明为INTEGER PRIMARY KEY将更有效:
cur.execute("CREATE TABLE C(Id INTEGER PRIMARY KEY)");
答案 1 :(得分:0)
您可以考虑调用executemany一次,而不是在循环中调用execute。
例如,请考虑以下代码,
for e in range(0,num): # num is a given number as input
cur.execute("UPDATE C SET column_I1_%d=? WHERE Id=%d"%(iter,e+1),(w[e],))
它可以转换为以下,
cur.executemany("UPDATE C SET column_I1_%d=? WHERE Id=?"%(iter), zip(w, range(num)))