簡體   English   中英

Python腳本需要很多時間/列表理解

[英]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.csvtest2.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.

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