Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使sqlite3列更新更快_Python_Sqlite - Fatal编程技术网

Python 使sqlite3列更新更快

Python 使sqlite3列更新更快,python,sqlite,Python,Sqlite,我已经编写了一个Python代码,它迭代地从sqlite数据库读取数据,对其进行一些计算,并将结果作为新列写回数据库,等等。然而,涉及通过更新列写入数据库的部分感觉随着时间越来越慢。有没有其他方法可以让我做同样的事情,但速度更快 下面是我代码的相关部分。在代码的这一部分中,创建了两个新列column_I1_uuu和column_I2_u,每个列以迭代编号结尾,如column_I1_1,column_I2_1,然后将新结果从相应的列表写入这些列中。问题是,考虑到迭代次数多、计算耗时,再加上行数多(

我已经编写了一个Python代码,它迭代地从sqlite数据库读取数据,对其进行一些计算,并将结果作为新列写回数据库,等等。然而,涉及通过更新列写入数据库的部分感觉随着时间越来越慢。有没有其他方法可以让我做同样的事情,但速度更快

下面是我代码的相关部分。在代码的这一部分中,创建了两个新列column_I1_uuu和column_I2_u,每个列以迭代编号结尾,如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新手,所以请对我放松点!:)

> P>您可以考虑调用ExcutuMeMon一次而不是在循环中调用Exctudio。< /P>

例如,考虑下面的代码,

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)))

要加快对
Id
列的查找,请在该列上创建索引:

cur.execute("CREATE INDEX MyLittleIndex ON C(Id)");
或者,如果
Id
列中的值是唯一的,则将此列声明为主键(这将自动创建索引):

如果值是整数,则将此列声明为INTEGER主键将更有效率:

cur.execute("CREATE TABLE C(Id INTEGER PRIMARY KEY)");

您是否尝试过当前执行代码?这可能更快…@JoranBeasley速度更快,但差别非常小。我检查过,对于每次更新,如果在循环中需要15秒,在excutemany形式中需要14.8秒。总比什么都没有好,但还是太多了。奇怪的是,随着模拟的进行和数据库中现有列数的增加,速度会减慢很多。虽然它写入相同数量的行,但在迭代13中,例如,相同的操作需要1分钟而不是15秒。我还没有完全明白如何降低成本……你有什么指标吗?有一些主键吗?@CL:没有,我没有主键,不确定索引……下面是我如何定义表的。在第一列中,我定义了ID,以便以后能够在右边的行中添加下一列的元素(其中ID=?)。实际上,可能是我应该使用无rowid表来加快速度还是?如前所述,我对这一点还很陌生,如果没有什么意义,我很抱歉。。使用sqlite3.connect('RDB.db')作为con:con.text_factory=int cur=con.cursor()cur.execute(“如果不存在创建表C('id'int)”)而不使用ROWID,只有在主键不适合整数的情况下才有意义。这使它运行得更快,尽管差别很小:t1=15.3050000668,而t2=14.792999828。我们达到极限了吗?哇!这使专栏写作时间减少了10倍!谢谢顺便提一下,还有一个问题……在每次迭代中向数据库写入特定列的时间都会增加,以某种方式通过迭代次数线性增加。由于我不会覆盖列,而且行数相同,我猜在每次更新中,python都会复制和写入整个数据库以及新的值。这是正确的吗?如果是的话,我如何避免这种情况?。此外,我还尝试关闭pragma synchronous=但没有任何区别;所需的时间是O(logn)。这将使很多事情的速度更快。。。。如果可以的话,基本上总是需要某种主键
cur.execute("CREATE TABLE C(Id INTEGER PRIMARY KEY)");