将数组转换为元组所需的时间似乎与数组的长度成线性比例。有没有办法更有效地做到这一点?我需要将具有 5e+6 个元素的数组插入到 mysql 数据库中,但 MySQLdb 似乎只接受元组或列表作为 insertmany 的输入。
最佳答案
MySQLdb 使用 re
和字符串插值将参数化 SQL 与参数连接起来,然后将查询作为字符串传递到服务器。显然这不是正确的方法——您不仅将数组转换为元组,而且还将元组转换为字符串。
相比之下oursql将 SQL 查询与数据分开发送到 MySQL 服务器。
由于您有 5 个数组,因此使用 zip
(或 column_stack
)将需要 Python(或 numpy)为组合对象(元组列表或 2D)分配更多内存numpy 数组)。为了避免这种情况,请使用 itertools.izip :
import itertools as it
x=np.random.random(1e6)
y=np.random.random(1e6)
connection = oursql.connect(
host=config.HOST, user=config.USER, passwd=config.PASS, db='test')
with connection.cursor() as cursor:
sql='INSERT INTO foo (x,y) VALUES (?,?)'
cursor.executemany(sql,it.izip(x,y))
print(cursor.lastrowid)
PS。之前我建议使用 oursql.BinaryIterWrapper
。我没能
然而,要使该解决方案发挥作用,可能是因为 this bug .
PPS。我尝试对上面的 oursql 代码与使用 MySQLdb 的类似代码进行计时。 然而,MySQLdb 无法计时,因为它引发了
_mysql_exceptions.OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")
在cursor.ecutemany(...)
上。
关于python - 在Python中将数组转换为元组/列表的快速方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7726526/