데이터베이스에 액세스하기 위해 파이썬 내장형 sqlite3
모듈을 사용하고있다. 내 쿼리는 150000 개 항목의 테이블과 40000 개 항목의 테이블간에 조인을 실행합니다. 결과에는 약 150000 개의 항목이 다시 포함됩니다. SQLite Manager에서 쿼리를 실행하면 몇 초가 걸리지 만 파이썬에서 같은 쿼리를 실행하면 1 분 후에 완료되지 않습니다. 다음은 내가 사용하는 코드입니다.파이썬과 조인 sqlite 모듈이 수동으로 수행하는 것보다 느리다.
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)
그래서 내가 직접 테이블을 가져 와서 파이썬으로 결합하면 약 2 초가 걸립니다. 위의 코드는 영원히 필요합니다. 내가 여기서 뭔가를 놓치고 있니?
2 EDIT은 는 지금 apsw과 같은 시도, 그리고, 성능이 좋은 (코드는 전혀 변경할 필요가 없습니다) 잘 작동합니다. 나는 아직도 이것이 왜 sqlite3
-module로 느린 지 궁금해하고있다. 여기에 대한 논의가있다
같은 SQLite는 인덱스를 만듭니다. PySqlite 홈페이지에서 Python과 함께 제공되는'sqlite3' 패키지는'PySqlite'와 동일하지만 어떤 버전인지는 말하지 않습니다. –
새로운 버전을 얻으려고합니다. – tamasd