当前位置:  开发笔记 > 编程语言 > 正文

加入Pythons sqlite模块比手动更慢

如何解决《加入Pythonssqlite模块比手动更慢》经验,为你挑选了1个好方法。

我使用pythons内置sqlite3模块来访问数据库.我的查询执行150000个条目的表和40000个条目的表之间的连接,结果再次包含大约150000个条目.如果我在SQLite管理器中执行查询需要几秒钟,但如果我从python执行相同的查询,它在一分钟后就没有完成.这是我使用的代码:

cursor = self._connection.cursor()
annotationList = cursor.execute("SELECT PrimaryId, GOId " + 
                                "FROM Proteins, Annotations " +
                                "WHERE Proteins.Id = Annotations.ProteinId")
annotations = defaultdict(list)
for protein, goterm in annotationList:
    annotations[protein].append(goterm)

我做了fetchall公正的测量执行时间.有没有人对性能的巨大差异有解释?我在Mac OS X 10.6.4上使用Python 2.6.1.

编辑

我手动实现了连接,这样可以更快地完成.代码如下所示:

cursor = self._connection.cursor()
proteinList = cursor.execute("SELECT Id, PrimaryId FROM Proteins ").fetchall()
annotationList = cursor.execute("SELECT ProteinId, GOId FROM Annotations").fetchall()
proteins = dict(proteinList)
annotations = defaultdict(list)
for protein, goterm in annotationList:
    annotations[proteins[protein]].append(goterm)

因此,当我自己获取表格然后在python中进行连接时,大约需要2秒钟.上面的代码需要永远.我在这里错过了什么吗?

第二次编辑 我现在尝试使用apsw,它工作正常(代码根本不需要更改),性能很棒.我仍然想知道为什么这个sqlite3-module 这么慢.



1> tamasd..:

这里有一个讨论:http://www.mail-archive.com/python-list@python.org/msg253067.html

似乎sqlite3模块中存在性能瓶颈.有一个建议如何使您的查询更快:

确保你在连接列上有索引

使用pysqlite

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有