在Python中快速将数组转换为元组/列表的方法?
看起来,把一个数组转换成元组所花的时间跟数组的长度成正比。也就是说,数组越长,转换的时间就越长。有没有更高效的方法呢?我需要把包含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")