首页 > 解决方案 > 如何有效地将 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%...

是否还有进一步优化的空间?

标签: pythonpandassqliteqtpyside2

解决方案


推荐阅读