使用pymysql插入语句时对execute与executemany两个方法进行测速

Posted 叶长风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用pymysql插入语句时对execute与executemany两个方法进行测速相关的知识,希望对你有一定的参考价值。

这两天,在写一个python小程序的时候突然大发奇想了一下,觉得可以测试一下pymysql包里面的execute()与executemany()的速度,executemany()实质上就是将数组中的元素一个个取出来然后一条条的执行,可以查看executemany()的源码为:

 def executemany(self, query, args):
        """Run several data against one query

        PyMySQL can execute bulkinsert for query like 'INSERT ... VALUES (%s)'.
        In other form of queries, just run :meth:`execute` many times.
        """
        if not args:
            return

        m = RE_INSERT_VALUES.match(query)
        if m:
            q_values = m.group(1).rstrip()
            assert q_values[0] == '(' and q_values[-1] == ')'
            q_prefix = query[:m.start(1)]
            return self._do_execute_many(q_prefix, q_values, args,
                                         self.max_stmt_length,
                                         self._get_db().encoding)

        self.rowcount = sum(self.execute(query, arg) for arg in args)
        return self.rowcount
这是pymysql中的源码,实际上执行的还是execute()方法。

然后再进行测试:

先测试executemany()方法的速度,以插入一万条数据来进行测试,源码为:

#!/usr/bin/python
#coding:utf-8
import pymysql
import time
conn=pymysql.connect(host='localhost',user='root',password='XXXXX')
pymysql.charset='gbk'
cur=conn.cursor()
conn.select_db('contacts')
values=[]
for i in range(10000):
    value=(str(i),'xiaxuan')
    values.append(value)
    
now=time.strftime("%M:%S")
try:
    cur.executemany("insert into xiaxuan values(%s,%s)",values)
    conn.commit()
except Exception as err:
    print(err)
finally:
    cur.close()
    conn.close()
end=time.strftime("%M:%S")
print(now+","+end)
花费时间为:

四秒左右,然后进行execute()方法的测试,源码为:

#!/usr/bin/python
#coding:utf-8
import time
import pymysql
conn=pymysql.connect(host='localhost',user='root',password='xxxxxx',db='contacts')
cur=conn.cursor()
values=[]
for i in range(10000):
    value=(str(i),'xiaxuan')
    values.append(value)
now=time.strftime("%M:%S")
for val in values:
    cur.execute("insert into xiaxuan values(%s,%s)",val)
conn.commit()
end=time.strftime("%M:%S")
print(now+","+end)
花费的时间为:

花费的时间长一点,五秒左右,这个时候突然脑残了一下,把上面的程序中的conn.commit()写在了for循环里面,进行了测试,时间为:

时间为将近10分钟了,好吧我承认是先搞的这个测试,然后再做的上面哪一个测试,每一次都进行了提交,这个速度不是一般的慢啊。

总体上,executemany()方法比上execute()方法在插入一万条数据时快将近一秒钟,我又测了下10万条数据,

发现execute()为59秒,executemany()为51秒,也只是快了八秒左右,也就是在executemany()方法中没有进行多少性能的优化,

但是如果数据量很大,这个时间应该会节省很多。基本上,就是这样。

以上是关于使用pymysql插入语句时对execute与executemany两个方法进行测速的主要内容,如果未能解决你的问题,请参考以下文章

PyMySQL 插入 NULL 或字符串

[ pymysql ] 三种插入方式的速度对比

使用输入使用 pymysql 插入数据

mysql基础之pymysql

PyMySQL模块的使用

pymysql使用