python - 如何将 Python 复合键、值字典写入数据库?

标签 python performance sqlite dictionary insert

我在 Python 中有一个复合键字典,如下所示:

key          value
("a","b")    (1,2,3)
("c","d")    (4,5,6)
("e","f")    (7,8,9)

键和值都是元组。我想以最有效的方式将它保存到这样的 sqlite 数据库表中:

row    col1   col2   col3   col4   col5
1      "a"    "b"    1      2      3
2      "c"    "d"    4      5      6
3      "e"    "f"    7      8      9

为此,我尝试逐行连接键和值,然后使用 INSERT 将此结构传递给 executemany()。这有效,但速度非常慢:

writedata = []

for i in range(0, len(mydict.keys())):
    writedata.append(mydict.keys()[i] + mydict.values()[i])

sql = "INSERT INTO mytable VALUES (?,?,?,?,?)"
mydbcursor.executemany(sql, writedata)

我有一个非常大的数据集,所以理想情况下我什至不想创建像上面的 writedata 这样的二级结构。

我已经尝试在 SO 上遵循许多解决方案(列表理解、列表 +、列表扩展、生成器等),但我还没有找到处理这种情况的正确方法。

任何帮助或链接将不胜感激!谢谢!

最佳答案

Cursor.executemany()也适用于迭代器:

The sqlite3 module also allows using an iterator yielding parameters instead of a sequence.

因此,您可以将一个生成器传递给它,而不是先创建一个中间列表:

mydbcursor.executemany(sql, (k + v for k, v in mydict.iteritems()))

在 Python3 中,.iteritems() 将不起作用,您可以使用 .items(),如果在内存中创建列表,它会返回项目的 View .

如果我们通过使用 itertools.starmapoperator.add 从我们的代码中完全删除 for 循环,我们可以获得更多的速度:

mydbcursor.executemany(sql, starmap(add, dct.iteritems())

时间比较表明使用上述迭代器花费的时间更少:

In [34]: from operator import add                                                                                                                

In [35]: from itertools import starmap                                                                                                    

In [36]: dct = {(i, 'a', 'b'): (1, 2, 3) for i in xrange(10**6)}

In [37]: %timeit for _ in (k+v for k, v in dct.iteritems()): pass                                                                                
1 loops, best of 3: 290 ms per loop                                                                                                              

In [38]: %timeit for _ in starmap(add, dct.iteritems()): pass                                                                                    
1 loops, best of 3: 256 ms per loop   

In [39]: %timeit list(starmap(add, dct.iteritems()))                                                                                             
1 loops, best of 3: 335 ms per loop                                                                                                              

In [40]: %timeit list(k+v for k, v in dct.iteritems())                                                                                           
1 loops, best of 3: 415 ms per loop    

关于python - 如何将 Python 复合键、值字典写入数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26704358/

相关文章:

python - 编写一个脚本,生成多个目录,创建空文件,然后列出当前目录下的所有文件

python - Sublime Text 中特定于语言的包设置

python - 计算以字符开头的单词

PHP - 为什么比较两个完整的长(相同)字符串比比较每个字符串的第一个字符要快得多?

sqlite - sqlite 'file change counter'超过最大大小时是否溢出?

双端队列上的 Python 标准差

c++ - 相对于另一个 vector 对一个 vector 进行排序 - 最有效的方法?

c++ - Boost MultiIndex Container,如何为快速插入做延迟索引?

django - 如果在生产和开发中使用不同的 RDBMS(例如 PostgreSQL),什么时候不应该在 Django 中使用 SQLite 进行测试?

带有 WHERE 条件的 SQLite 查询显示名称 - 多个表