我使用pythons内置的sqlite3
模块访问数据库。我的查询在一个包含150000个条目的表和一个包含40000个条目的表之间执行一个联接,结果再次包含大约150000个条目。如果我在SQLite Manager中执行查询,则需要几秒钟的时间,但如果我从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
只是为了测量执行时间。有人能解释这种巨大的性能差异吗?我在macosx10.6.4上使用python2.6.1。在
编辑
我手动实现了连接,这工作得更快。代码如下:
^{pr2}$因此,当我自己获取表,然后用python进行连接时,大约需要2秒钟。上面的代码要花很长时间。我是不是少了点什么?在
第二次编辑
我现在用apsw做了同样的尝试,效果很好(代码根本不需要更改),性能非常好。我仍然在想,为什么使用sqlite3
-模块的速度这么慢。在
这里有一个关于它的讨论:http://www.mail-archive.com/python-list@python.org/msg253067.html
看来sqlite3模块中存在性能瓶颈。有一个advice如何使查询更快:
您还没有发布相关表的模式,但是我认为索引可能有问题,特别是没有索引蛋白质。Id或者注释.ProteinId(或两者兼而有之)。在
创建如下SQLite索引
相关问题 更多 >
编程相关推荐