How does one enable or disable statement caching then? For something as basic 
as just inserting integers executemany is about 3 times faster.

Python version: 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 
32 bit (Intel)]
Python sqlite3 module version: 2.6.0
sqlite3.dll version: 3.20.1
executemany takes: 8.674 seconds for 10,000,000 inserts
execute takes 30.173 seconds for 10,000,000 inserts


import sqlite3
import sys
import time

numInts = 10000000

def genFunc():
    for x in xrange(numInts):
        yield (x,)

def execute():
    startTime = time.clock()
    with sqlite3.connect(":memory:", isolation_level = None) as conn:
        conn.execute("begin transaction;")
        conn.execute("create table foo (bar int);")
        for x in xrange(numInts):
            conn.execute("insert into foo values (?);", (x,))
        conn.commit()
    conn.close()
    endTime = time.clock()
    return endTime - startTime

def executemany():
    startTime = time.clock()
    with sqlite3.connect(":memory:", isolation_level = None) as conn:
        conn.execute("begin transaction;")
        conn.execute("create table foo (bar int);")
        conn.executemany("insert into foo values (?);", genFunc())
        conn.commit()
    conn.close()
    endTime = time.clock()
    return endTime - startTime

if __name__ == "__main__":
    print "Python version: {0}".format(sys.version)
    print "Python sqlite3 module version: {0}".format(sqlite3.version)
    print "sqlite3.dll version: {0}".format(sqlite3.sqlite_version)
    print "executemany takes: {0:,.3f} seconds for {1:,d} 
inserts".format(executemany(), numInts)
    print "execute takes {0:,.3f} seconds for {1:,d} inserts".format(execute(), 
numInts)

-----Original Message-----
From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] On 
Behalf Of Keith Medcalf
Sent: Monday, October 23, 2017 11:55 AM
To: SQLite mailing list
Subject: Re: [sqlite] Article about using sqlite3 in Python

execute vs executemany is merely syntactic sugar.  If and only if you have 
disabled statement caching will the statement be recompiled each time.  In all 
cases the sequence of sequences parameter is used as a binding to multiple 
calls to execute.  executemany is the equivalent of:

executemany(sql, param)
->
for args in param:
    execute(sql, args)

and has no (or very little) benefit over doing the same thing in Python itself 
(yes, the iteration is run in C, but it is still entirely calling into the 
Python VM to do all its work, so there is very little if any benefit there -- 
the only real benefit over the above is that locating the cached statement is 
only done once when you use executemany and the same C stmt pointer is used 
over and over again without looking it up in the cache, which does save a few 
cycles -- however since since the bulk of the time is spent inside the I/O 
bound SQLite3 library code where the GIL is released, this effectively makes 
minimal difference in the long run).
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to