gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:29:10 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com