Python sqlite3模块在处理以注释开头的SQL查询时是否存在错误且速度缓慢?

Python sqlite3模块在处理以注释开头的SQL查询时是否存在错误且速度缓慢?,python,sqlite,python-sql,Python,Sqlite,Python Sql,我注意到,如果SQL查询以使用-comment格式的注释开始,我的sqlite3查询将花费375倍的时间。这是正常的行为吗?它是内置sqlite3模块中的一个bug吗 import pathlib import sqlite3 import timeit def test_do(sql): db_path = pathlib.Path("./test.sqlite3") con = sqlite3.connect(db_path) cursor = con.curso

我注意到,如果SQL查询以使用-comment格式的注释开始,我的sqlite3查询将花费375倍的时间。这是正常的行为吗?它是内置sqlite3模块中的一个bug吗

import pathlib
import sqlite3
import timeit


def test_do(sql):
    db_path = pathlib.Path("./test.sqlite3")
    con = sqlite3.connect(db_path)
    cursor = con.cursor()

    table_sql: str = f"""
        CREATE TABLE IF NOT EXISTS test (
            id INTEGER PRIMARY KEY)"""

    cursor.execute(table_sql)

    for i in range(1, 43000):
        cursor.execute(sql, [i])

    con.commit()
    db_path.unlink()


sqlslow = f"""
    --comment
    INSERT INTO "test" ("id") VALUES (?)
    """

sqlfast = f"""
    INSERT INTO "test" ("id") VALUES (?)
    """

starttimeslow = timeit.default_timer()
test_do(sqlslow)
print(f"sqlslow: {timeit.default_timer() - starttimeslow}")

starttimefast = timeit.default_timer()
test_do(sqlfast)
print(f"sqlfast: {timeit.default_timer() - starttimefast}")
结果:

sqlslow: 21.521265994
sqlfast: 0.05736106100000171

编辑:我在/**/style注释中发现了相同的行为。

从表面上看,性能肯定与注释有关,我在sqlite3 20秒和0.05秒中看到了类似的结果。但我认为这还不止这些

我用包替换了代码中的sqlite3,该包具有不同的事务处理,使用该包时,两个测试的时间都是20秒。请注意,apsw不会自动为您启动事务,sqlite3会这样做

然后,我在43k个插入中明确地包含了一个事务begin/commit,这两次都花费了0.05秒。这是有意义的,因为此代码在事务中应该运行得更快

这一切都表明sqlite3在一种情况下使用的是事务,即单行插入,而在另一种情况下使用的是带注释和插入的多行语句。另外,sqlite3的事务处理虽然旨在让用户更简单,但似乎有点奇怪

事实上,如果我显式插入以下begin事务,那么sqlite3结果都是0.05秒:

cursor.execute(table_sql)
cursor.execute("begin") # add this

for i in range(1, 43000):
    cursor.execute(sql, [i])

con.commit()
sqlite3测试的输出现在是:

sqlslow: 0.051317919000000004
sqlfast: 0.05007833699999999

在未注释查询之后,反转执行注释查询的调用。在这种情况下,结果如何?这些结果对你有什么启示吗?如果我将它们颠倒过来,结果基本上是一样的:sqlfast:0.0581808470000036 sqlslow:21.596948887我不知道它为什么会这样做。我已经添加了一个答案,我想,可以解释这种行为。