我有一个小脚本,该脚本从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
答案 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.csv
和test2.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])