C# SQLite:不明白为什么我的算法在Python中比C快很多

C# SQLite:不明白为什么我的算法在Python中比C快很多,c#,python,sqlite,C#,Python,Sqlite,我最近编写了一些软件来处理从一些旧数据库到SQL的大规模数据迁移。因为SQLite是潜在的目标之一,所以我决定编写一个程序,首先执行转换,然后用户可以选择服务器目标MSSQL、Postgres等 我第一次用Python编写这个命令行工具是因为我是唯一一个使用它的人,我认为没有必要为它制作一个花哨的前端,而且那里的一切都很好。然后这件事开始了,整个公司都想用它来升级公司的所有内部数据。其他人都在Windows上,不习惯命令行的东西,所以我编写了一个C前端,它在后台调用Python脚本。预期用途是指

我最近编写了一些软件来处理从一些旧数据库到SQL的大规模数据迁移。因为SQLite是潜在的目标之一,所以我决定编写一个程序,首先执行转换,然后用户可以选择服务器目标MSSQL、Postgres等

我第一次用Python编写这个命令行工具是因为我是唯一一个使用它的人,我认为没有必要为它制作一个花哨的前端,而且那里的一切都很好。然后这件事开始了,整个公司都想用它来升级公司的所有内部数据。其他人都在Windows上,不习惯命令行的东西,所以我编写了一个C前端,它在后台调用Python脚本。预期用途是指定一个目录,然后递归地转换根目录下以.dbf结尾的每个文件。这是预期的效果,我在C程序中添加了一些线程,使其速度更快

问题是,我的老板想把所有东西都移到C,因为他不懂Python。这是我第一次看C代码。我使用完全相同的算法和数据结构:

########################################################################################################
# Insert rows to table
########################################################################################################
def sqlexec(c, s):
    if clargs['verbose']:
        print(s)
    c.execute(s)

for row in records:
    sql = "INSERT INTO {} VALUES(".format(table_name)
    for fname in row:
        # text data needs 'single quotes' around it, so handle it differently

        # text data
        if row[type] == 'C':
            sql += "'{}',".format(row[fname])

        # numeric data
        else:
            sql += "{},".format(row[fname])

    sql = "{});".format(sql[ 0 : len(sql) - 1 ]) # remove the last comma
    sqlexec(cur, sql)
#_______________________________________________________________________________________________________
records是一个字典列表,键是tuplecolumn名称、列数据类型,值是包含数据的字符串


使用这个用C编写的完全相同的算法,并将SQL命令打印到一个DBF文件的控制台上,我可以看到Python脚本在其中的缩放速度太快而无法读取,而C转换器缓慢地将每个INSERT打印到语句中,几乎慢到可以大声读取。在C中使用Python内置的sqlite3包和System.Data.SQLite。在C中我应该做些什么来加快速度?我认为这可能是因为每个命令都是在C中立即提交的,而在Python中,事务是用来在最后一批中提交它们的

我不确定这是否是正确的方法。就像在sqlite3中一样,您应该
将BEGIN\END语句包装在批量插入周围。Sqlite针对事务进行了优化。因此,如果您在开始和结束之间执行所有事务,那么它可能会工作

因为你没有显示C代码,所以很难告诉你你做错了什么…你是说速度慢是因为从FoxPro中选择数据?几年前,当我与C和FoxPro一起工作时,它是一只狗,因为.NET无法识别FoxPro中的索引,并且每个select都进行了完整的表扫描。方法是在中间使用FP应用程序,类似于如果你的源是FP,从C调用Python。@ ReGeNyStudio——我使用它来编写我自己的代码,并打开文件进行解析,因为我觉得这和学习FoxPro的一些过时的东西需要花费相当的时间。它工作得很好,花费的时间也很短-唯一的瓶颈似乎是C中的SQLite插入,我很确定这是因为我没有显式使用事务,但我对C和SQL编程都是新手,所以我想在这里提问是明智的。@KevinCook-算法是完全相同的,它可以工作,问题来自SQLite的C库的内部,导致在执行相同的操作时插入要花费更长的时间。我的Python代码和C代码之间的区别纯粹是语法上的,Python代码更容易在这里发布,因为C代码被抽象为不同的方法和类,以适应OOP风格。如果人们真的想要,我可以发布,但我确信算法是一样的。谢谢你的输入。按照我的理解,Python中的sqlite3包自动使用事务,而C的System.Data.SQLite不使用事务——这就是为什么必须在Python中调用my_connection.commit来保存更改,而在C中则不这样做的原因。只要调用connection.ExecuteNonQuerycommandyes,数据库就会反映更改。您可以这样声明它。