python - 如何有效地将 QSqlQuery 结果加载到 pandas DataFrame?
问题描述
有一个内置的 Pandas 方法可以从 SQL 表中加载数据,它适用于 sqlite:
import sqlite3
import pandas as pd
cnx = sqlite3.connect('/home/db.sqlite')
%timeit df = pd.read_sql_query("SELECT * FROM table", cnx)
它217 ms ± 6.45 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
为我的示例表提供。
但我有 Qt GUI 应用程序并使用QSqlDatabase
,QSqlQuery
类。所以我使用以下代码:
from PySide2.QtSql import QSqlDatabase, QSqlQuery
db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName('/home/db.sqlite')
db.open()
def load_pandas(db, statement):
query = QSqlQuery(db)
query.prepare(statement)
query.exec_()
table = []
while query.next():
values = []
for i in range(query.record().count()):
values.append(query.value(i))
table.append(values)
return pd.DataFrame(table)
%timeit df = load_pandas(db, "SELECT * FROM table")
它导致429 ms ± 3.37 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
,即它比熊猫原生例程慢两倍。
用一个常数值替换query.record().count()
我能够将它减少到328 ms ± 4.65 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
. 但它仍然慢了 50%...
是否还有进一步优化的空间?
解决方案
推荐阅读
- angular - 错误 TS2307:在 moment-date-adapter.d.ts 中找不到模块“moment”
- javascript - 文字对象中的“this”关键字
- android - Android ContentObserver-判断短信状态
- sql - 返回满足并同时具有 IN 条件的行(Ids)
- ios - Swift 中的推送通知和令牌设备
- android - ListView没有显示在android的对话框中
- nlp - 使用 Spacy 自定义句子分割
- java - 我的应用程序中出现 Java 错误,不知道该怎么办
- powerapps - 在 powerapps 中加载问题
- vuejs2 - vueresource 等待上一个http请求完成后再执行下一个请求