【问题标题】:Performance: look in list or sql query性能:查看列表或 sql 查询
【发布时间】:2015-12-18 05:55:03
【问题描述】:

我用 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 中的速度和空间如何?如果项目很少或很多,结果会有所不同吗?

【问题讨论】:

    标签: python sql performance sqlite pyqt


    【解决方案1】:

    使用 time.perf_counter() 来确定这个过程当前需要多长时间。

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

    基于此,如果运行速度太慢(),您可以尝试每个选项,并为它们计时以寻求性能改进。至于检查内存使用情况,一个简单的方法是这样的:

    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 使用/等时,始终有一种客观测量方法。

    【讨论】:

      【解决方案2】:

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

      这样想,既然可以做一次,为什么还要做两次(复制所有这些行并使用它们)?

      你想基本上执行这个:

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

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

      【讨论】:

      • 对不起,我忘了说我还需要检查文章是否单独在list_doi中。这么看:文章不在 list_doi 中,也不在 list_ok 中 -> 动作 a; list_doi 中的文章,但 list_ok 中的文章 -> 操作 b; list_doi 和 list_ok 中的文章 -> action c
      • 而 list_doi 只是文章 ID 的列表,对吗?因此,您可以通过执行查询 ("select count * from tablename where id=" + ID ) >0 对名为 has_id 或 in _table 的函数执行相同的操作
      • 是的,我能做到。问题不存在:什么会更有效?每次需要查看文章时执行一次 SQL 查询,还是构建两个列表一次并在每次需要查看文章时进行搜索?
      • 我明白你在问什么。前一秒,我刚刚找到一篇应该对您有所帮助的文章。
      猜你喜欢
      • 1970-01-01
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多