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

2 投票
1 回答
1381 浏览
提问于 2025-04-17 04:05

看起来,把一个数组转换成元组所花的时间跟数组的长度成正比。也就是说,数组越长,转换的时间就越长。有没有更高效的方法呢?我需要把包含500万个元素的数组插入到MySQL数据库里,但MySQLdb似乎只接受元组或列表作为插入的输入。

1 个回答

4

MySQLdb这个库在把参数化的SQL语句和参数结合起来时,使用了re模块和字符串插值,然后再把这个字符串发送给服务器。显然,这种做法不太好——不仅要把数组转换成元组,还要把元组转换成字符串。

相比之下,oursql则是把SQL查询和数据分开发送到MySQL服务器。


因为你有5个数组,使用zip(或者column_stack)会让Python(或者numpy)需要分配更多的内存来存放合并后的对象(比如元组列表或者二维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)

顺便说一下,之前我建议使用oursql.BinaryIterWrapper。不过我没能让这个方案工作,可能是因为这个bug

再说一下,我尝试对比了上面的oursql代码和使用MySQLdb的类似代码的执行时间。但是对于MySQLdb来说,由于它在cursor.ecutemany(...)时出现了错误,所以无法进行时间测量。

_mysql_exceptions.OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")

撰写回答