2013-02-14 110 views
0

当我使用Python 2.5访问Sqlite数据库时,它需要很长时间,但如果我通过其他方式(包括Python 3.2)访问同一个数据库,它将花费更短的时间。这是怎么回事? (我需要Python 2.5并且无法切换到Python 3.2)Python 2.5上的Sqlite3速度太慢

+2

它可以是Python 2.6或2.7? – Gjordis 2013-02-14 19:33:51

+1

你有在JOIN和WHERE子句中使用的字段的索引吗? – bernie 2013-02-14 19:34:58

+0

我试过Python 2.7,它的工作原理。不过我想知道其他解决方案。如果我分享我的代码,我需要告诉切换到2.7。 Python 2.5带有许多我公司使用的软件。 – 2013-02-14 20:03:54

回答

4

不用说,如果您使用旧版本的程序,您将无法获得性能改进,错误修复和功能添加稍后添加。在许多方面,Python 2.5比2.7(或3.2)更慢,更缓慢,功能更强大,而且大多数情况下,唯一的解决方案是“停止使用2.5”,除非您想追踪更改日志和反向端口的具体改进它到了2.5代码库。

但是在这种情况下,它更容易,因为sqlite3是独立于Python开发的(事实上,在2.5之前,它甚至没有内置),因为pysqlite。下面是一些版本的历史(所看到的新增文档中为2.62.7):

  • 的Python 2.5:pysqlite 2.3.2
  • 的Python 2.6:pysqlite 2.4.1
  • 的Python 2.7:2.6 pysqlite。 0

最新版本是2.6.3。您可以使用任何常用方法(pip,easy_install,从网站下载并遵循说明,从网站下载Windows二进制安装程序并运行它们等)来安装它。

事实上,如果你正在构建与setuptools/distribute一个包,你可能只是能够把一个要求为>= 2.6.0pip install mypackage将自动获得2.5(和2.6的用户)的新版本。

您的问题也可能与底层C sqlite3库不同,而不是pysqlite包装。如果你安装了sqlite3,然后从源码生成pysqlite,那么你也可以解决这个问题。

如果你不能确定你的版本,你可以在运行时检查,因为该模块具有人类可读version属性(和version_info元组就像一个在sys,这样你就可以检查version_info >= (2, 6))并且对于底层C库同样为sqlite_versionsqlite_version_info

+0

你的答案有很多的信息和建议,将有助于,谢谢! – 2013-02-14 21:01:53

1

除了abarnert的出色答案之外,还要看你多久做一次提交。在SQLite中进行组合的速度很慢,如果延迟,通常会带来性能方面的好处。在我做了一些other testing期间,我自己也遇到过这种情况,并且减少提交次数的性能差异非常大。

+0

这是非常好的建议,但如果这是他的问题,为什么Python 2.7/3.2(pysqlite 2.6.0)解决了它?自动提交每个插入的最新版本仍然很慢。 (为了记录,我同意他应该研究这个 - 任何关心sqlite性能并且不知道需要学习它的人。) – abarnert 2013-02-14 20:37:38

+0

我不知道为什么版本会影响很多。当然,他说他需要2.5,所以他在2.5下运行的代码和他在3.x中测试的代码有可能在一个重要的方面有所不同,比如在他的2.5代码中更频繁地提交。 – TimothyAWiseman 2013-02-14 20:40:27

+0

这是可能的 - 但请记住,他还测试了2.7,并且它也解决了这个问题。我认为他的2.7代码更像他的2.5代码而不是他的3.2代码 - 事实上,它可能仅仅是他的2.5代码。 pysqlite在2.3.2(2006年7月2日)和2.6.0(2010年3月5日)之间的几十个与性能相关的软件包中的一个更有可能成为问题。 – abarnert 2013-02-14 21:00:54