python - 在Python中将数组转换为元组/列表的快速方法?

标签 python numpy mysql-python

将数组转换为元组所需的时间似乎与数组的长度成线性比例。有没有办法更有效地做到这一点?我需要将具有 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/

相关文章:

python - 按列向量化二维字符数组

Python:MySQLdb LOAD DATA INFILE 静默失败

python mysqldb INSERT 在 AUTO_INCREMENT 主列中插入任意值

python - 在 pylab 中更改 numpy.sin(wt) 的振幅和频率

python - 在范围内合并 Pandas 数据框的最快方法

python - 使用 pandas 将两个 Excel 表与 Python 连接起来

python - 删除 numba.lowering.LoweringError : Internal error

python - 尝试为 Python 安装 Pandas

Python MySQLdb 不导入

c - 如何在 Cython 中动态声明二维 c 数组