我编写了一个Python代码,它迭代地从sqlite数据库读取数据,对其进行一些计算,并将结果以新列的形式写入数据库,等等。但是,通过更新列来写入数据库的部分感觉随着时间的推移变得越来越慢。有没有其他方法可以让我做同样的事情,但速度更快?
下面是我代码的相关部分。在代码的这一部分中,创建了两个新列column_I1_和column_I2_,每个列以迭代数结尾,比如column_I1_1、column_I2_1,然后从相应的列表将新的结果写入这些列中。问题是,考虑到迭代次数多,计算耗时,加上高行数(这里由num值定义,大约11000行),这一工作太慢了.
是否有其他方法来代替使用update?因为我认为要进行更新,每次添加新值时都必须复制该列,这会导致速度减慢。我以前经常使用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新手,所以请对我轻松一点!:)
发布于 2014-06-24 00:27:57
若要加快对Id
列的查找,请在其上创建一个索引:
cur.execute("CREATE INDEX MyLittleIndex ON C(Id)");
或者,如果Id
列中的值是唯一的,则将该列声明为主键(自动创建索引):
cur.execute("CREATE TABLE C(Id PRIMARY KEY)");
如果值是整数,则将此列声明为整数主键会更有效:
cur.execute("CREATE TABLE C(Id INTEGER PRIMARY KEY)");
发布于 2014-06-23 14:57:15
您可以考虑一次调用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)))
https://stackoverflow.com/questions/24375531
复制相似问题