性能:查看列表或SQL查询

时间:2015-09-21 13:41:15

标签: python sql performance sqlite pyqt

我开发了一个用PyQt和sqlite来管理科学文章的软件。每篇文章都存储在sqlite数据库中,并来自特定的期刊。

有时,我需要对期刊的文章进行一些验证。所以我构建了两个列表,一个包含文章的DOI(一个DOI只是文章的唯一ID),一个包含布尔值,如果文章没问题,则为True;如果文章不是,则为False:

def listDoi(self, journal_abb):

    """Function to get the doi from the database.
    Also returns a list of booleans to check if the data are complete"""

    list_doi = []
    list_ok = []

    query = QtSql.QSqlQuery(self.bdd)
    query.prepare("SELECT * FROM papers WHERE journal=?")
    query.addBindValue(journal_abb)
    query.exec_()

    while query.next():
        record = query.record()
        list_doi.append(record.value('doi'))

        if record.value('graphical_abstract') != "Empty":
            list_ok.append(True)
        else:
            list_ok.append(False)

    return list_doi, list_ok

此函数返回两个列表。这些列表每个可包含约2000个项目。在那之后,为了检查文章是否正常,我只是检查它是否在两个列表中。

编辑:我还需要检查文章是否只在list_doi中。

所以我想知道,因为这里的表现很重要:什么是更快/更好/更经济:

  • 构建两个列表,并检查文章是否存在于两个列表中
  • 以另一种方式编写函数:checkArticle(doi_article),该函数将为每篇文章执行SQL查询

RAM的速度和空间怎么样?如果项目很少或很多项目,结果会不同吗?

2 个答案:

答案 0 :(得分:0)

使用time.perf_counter()确定此进程当前需要多长时间。

time_start = time.perf_counter()
# your code here
print(time.perf_counter() - time_start)

基于此,如果它太慢(),您可以尝试每个选项,并为它们计时以寻找性能方面的改进。至于检查RAM使用情况,一个简单的方法是:

import os
import psutil
process = psutil.Process(os.getpid())
print process.get_memory_info()[0] / float(2 ** 20)    # return the memory usage in MB

有关更深入的内存使用情况检查,请查看此处:https://stackoverflow.com/a/110826/3841261总是有办法在寻求提高速度/ RAM使用率等时进行客观测量。

答案 1 :(得分:0)

我会执行一个sql查询,一次找到好的文章(可能在一个名为find_articles()的函数中)

以这种方式思考,为什么要做两次(复制所有这些行并使用它们),当你可以做一次?

你想基本上执行这个:

SELECT * from papers where (PAPERID in OTHERTABLE and OTHER RESTRAINT = "WHATEVER")

这显然只是伪代码,但我认为你可以搞清楚。