在大型 python 串列中回圈字串并將它們傳遞到 SQLite SELECT 陳述句以回傳值時,我遇到了巨大的性能下降,每個回圈需要 0.5s 到 0.7s。(10K 字串約 2 小時)
在廣泛搜索之后,我不確定如何實作一種方法來將串列“批量”匯出到更少的合并查詢中,以期提高速度。
我從一個函式中生成了這個檔案名串列:
documents = ['value1.xlsx', 'value2.docx', 'value3.txt', 'value4.csv', ...]
我還有一個 1GB 的大型資料庫,里面裝滿了獨特的檔案名和檔案哈希。
def iterate_documents(cur, documents):
i = 0
output = [] # Declare Empty List
while i < len(documents):
# Returning the MD5 Hash of a Passed File Name
match = cur.execute('SELECT md5hash FROM hash_table WHERE name=?', (documents[i],)).fetchone()
# If a File Name hasn't been seen by the DB, say the hash is "Unknown"
if match is None or len(match) == 0:
match = "Unknown"
else:
match = match[0]
output.append(match) # Append the match or 'Unknown' to the Output List
i = 1
return output
示例輸出: hashes = [hash-1, hash-2, Unknown, value-4, ...]
我接下來要做的是使用有序輸出來匹配 tuples 中的檔案和哈希(documents[i], hashes[i])。例子:('value1.xlsx', 'hash-1')
所以我需要這些iterate_documents()值保持它們被傳遞的順序。到目前為止,蠻力回圈是我得到的最好的!
uj5u.com熱心網友回復:
您有幾個 Python 性能選項,而無需進行大量代碼修改。
1.) 你可以使用 PyPy
這將是最簡單的方法
PyPy 是一種運行時解釋器,它比完全解釋的語言快,但比完全編譯的語言(如 C)慢。
PyPY 鏈接
2.) 您可以嘗試多執行緒或并行處理
這將更加困難
執行緒檔案
通過修改代碼,您還有幾個選擇。
1.) 使用 for 回圈而不是 while 回圈
For 回圈在 Python 中更快,但在 C 中則不然
比較 for 回圈和 while 回圈
2.) 不要將變數傳遞documents給函式變數documents是一個可變值,并且會隨著變大而變化。這會給函式帶來問題,因為您每次都在重新創建 var
uj5u.com熱心網友回復:
由于它只有 10k 個專案,我可能只從資料庫中獲取您需要的專案,然后在本地進行更多匹配:
import sqlite3
def chunks(l, n):
for i in range(0, len(l), n):
yield l[i:i n]
conn = sqlite3.connect('test.db')
conn.execute('''
CREATE TABLE IF NOT EXISTS hash_table(
name TEXT PRIMARY KEY NOT NULL,
md5hash TEXT
);
''')
conn.execute("INSERT INTO hash_table(name,md5hash) VALUES ('value1.xlsx', 'some hash of value1.xlsx');")
conn.execute("INSERT INTO hash_table(name,md5hash) VALUES ('value2.docx', 'some hash of value2.docx');")
documents = ['value1.xlsx', 'value2.docx', 'value3.txt', 'value4.csv']
lookup = {}
## -----------------------
## load the lookup in chunks due to limits of SQLLite
# ## -----------------------
chunck_size = 100
for chunc in chunks(documents, chunck_size):
sql = f"SELECT name, md5hash FROM hash_table WHERE name in ({','.join(['?']*len(chunc))})"
lookup = {**lookup, **dict(conn.execute(sql, chunc).fetchall())}
## -----------------------
doc_with_hash = {doc: lookup.get(doc, "Unknown") for doc in documents}
print(doc_with_hash)
那應該給你:
{
'value1.xlsx': 'some hash of value1.xlsx',
'value2.docx': 'some hash of value2.docx',
'value3.txt': 'Unknown',
'value4.csv': 'Unknown'
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/385021.html
