Python脚本需要很多时间/列表理解

时间:2018-12-27 15:54:19

标签: python csv

我有一个小脚本,该脚本从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

5 个答案:

答案 0 :(得分:4)

data_2设为一组。

data_2 = set(import_csv("test2.csv"))

在Python中,使用集合更快地检查对象是否存在(使用in运算符)。

切换输入顺序也可能会带来一些改进。将较大的文件设置为集合,这样一来,当您遍历较小文件的元素时,您将减少查找次数。

答案 1 :(得分:2)

如果可以安全地丢弃重复项,则可以使用set,它是intersection

data1 = [1,2,3,3,4]
data2 = [2,3,5,6,1,6]

print(len(set(data1).intersection(data2)))
# 3

这是设置的操作,可以保证比您的操作更快。

答案 2 :(得分:0)

尝试

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])

答案 3 :(得分:0)

我在这里做一些假设,但这是一个主意...
test1.csvtest2.csv具有唯一性,例如序列号。喜欢...

  

9210268126,4628032171,6691918168,1499888554,2024134986,   8826205840,5643225730,3174290295,1881330725,7192644763,   7210351670,7956881819,4897219228,4638431591,6444695480,   1949859915,8919131597,2176933146,3875411064,3546520925

尝试...

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))

我不确定如何更快地进行操作-那时这可能是硬件瓶颈。

答案 4 :(得分:0)

那个也应该起作用。它将列表转换为字典,并避免使用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])