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

时间:2011-10-11 13:08:31

标签: python numpy mysql-python

似乎将数组转换为元组所花费的时间与数组的长度呈线性关系。有没有办法更有效率地做到这一点?我需要将带有5e + 6个元素的数组插入到mysql数据库中,但MySQLdb似乎只接受元组或列表作为insertmany的输入。

1 个答案:

答案 0 :(得分:4)

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。我尝试使用MySQLdb计算上述自己的代码与类似的代码。 但是,自从它引发了

以来,MySQLdb没有时间可行
_mysql_exceptions.OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")

on cursor.ecutemany(...)