[英]Python Script takes much time / List comprehensions
我有一個小腳本,該腳本從CSV輸入文件中比較第二個列表中第一個列表中有多少個項目。 但是,如果有很多引用,則需要一定的時間才能運行。
data_1 = import_csv("test1.csv")
print(len(data_1))
data_2 = import_csv("test2.csv")
print(len(data_2))
data_to_keep = len([i for i in data_1 if i in data_2])
我只對第一個列表運行了598756個項目,對第二個列表運行了76612個項目,但腳本尚未完成。
由於我對Python還是比較陌生,所以我想知道是否有最快的方法來實現我想做的事情。 謝謝您的幫助 :)
編輯:導入CSV看起來像這樣:
def import_csv(csvfilename):
data = []
with open(csvfilename, "r", encoding="utf-8", errors="ignore") as scraped:
reader = csv.reader(scraped, delimiter=',')
for row in reader:
if row: # avoid blank lines
data.append(row[0])
return data
將data_2
一組。
data_2 = set(import_csv("test2.csv"))
在Python中,集合可以更快地檢查對象是否存在(使用in
運算符)。
通過切換輸入的順序,您可能還會看到一些改進。 將較大的文件設置為集合,這樣,當您遍歷較小文件的元素時,可以進行較少的查找。
如果可以安全地丟棄重復項,則可以使用set
及其intersection
項:
data1 = [1,2,3,3,4]
data2 = [2,3,5,6,1,6]
print(len(set(data1).intersection(data2)))
# 3
這是設定的操作,並且保證比您做的更快。
試試吧
import csv
with open('test1.csv', newline='') as csvfile:
list1 = csv.reader(csvfile, delimiter=',')
with open('test2.csv', newline='') as csvfile2:
list2 = csv.reader(csvfile2, delimiter=',')
data_to_keep = len([i for i in list1 if i in list2])
我在這里做一些假設,但這是一個主意...
test1.csv
和test2.csv
具有唯一的名稱,例如序列號。 喜歡...
9210268126,4628032171,6691918168,1499888554,2024134986,8826205840,5643225730,3174290295,1881330725,7192644763,7210351670,7956881819,4897219228,4638431591,6444695480,1949859915,8919131597,2176933146,387209256464,465
嘗試...
with open("test1.csv") as f1, open("test2.csv") as f2:
data_1 = [line.split(",") for line in f1]
data_2 = [line.split(",") for line in f2]
由於它們是唯一的,因此我們可以使用set函數來查看另一個文件中的條目:
data_to_keep = set(data_1).intersection(set(data_2))
我不確定如何更快地執行此操作-那時這可能是硬件瓶頸。
那也應該工作。 它將列表轉換為字典,並避免了使用in
運算符執行的順序搜索。 在大數據環境中,您通常避免使用in
運算符。
data_1 = import_csv("test1.csv")
data_2 = dict([(i,i) for i in import_csv("test2.csv")])
data_to_keep = len([i for i in data_1 if data_2.get(i) is not None])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.