簡體   English   中英

性能:在列表或SQL查詢中查找

[英]Performance: look in list or sql query

我用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的速度和空間如何? 如果項目很少或很多,結果會有所不同嗎?

使用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使用率/等等時,總有一種客觀的方法。

我將執行一個sql查詢,一次查找確定的文章(也許在名為find_articles()的函數中)

這樣想,為什么一次只能做兩次(復制所有這些行並與之協同工作)?

您基本上要執行此操作:

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

那顯然只是偽代碼,但我想您可以弄清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM