2013-02-14 153 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