代码运行缓慢 - python 中的性能问题
Code is working slow - performance issue in python
我有一个包含 4 列分隔值的文件。我只需要第一列,所以我读取了文件,然后将该行拆分,分隔并将其存储在一个名为 first_file_list.
的列表变量中
我有另一个文件,其中包含 6 列分隔值。我的要求是读取文件第一行的第一列,并检查字符串是否存在于名为 first_file_list 的列表中。如果存在,则将该行复制到新文件。
我的第一个文件大约有。 600 万条记录和第二个文件有大约。 450 万条记录。只是为了检查我的代码而不是 450 万的性能,我在第二个文件中只放了 100k 条记录,处理这 100k 条记录的代码大约需要。 2.5小时。
以下是我的逻辑:
first_file_list = []
with open("c:\first_file.csv") as first_f:
next(first_f) # Ignoring first row as it is header and I don't need that
temp = first_f.readlines()
for x in temp:
first_file_list.append(x.split(',')[0])
first_f.close()
with open("c:\second_file.csv") as second_f:
next(second_f)
second_file_co = second_f.readlines()
second_f.close()
out_file = open("c:\output_file.csv", "a")
for x in second_file_co:
if x.split(',')[0] in first_file_list:
out_file.write(x)
out_file.close()
能否请您帮助我了解我在这里做错了什么,以至于我的代码需要这么多时间来比较 10 万条记录?或者你能在 Python.
中建议更好的方法吗
使用集合 - 见下文
first_file_values = set()
second_file_values = set()
with open("c:\first_file.csv") as first_f:
next(first_f)
temp = first_f.readlines()
for x in temp:
first_file_values.add(x.split(',')[0])
with open("c:\second_file.csv") as second_f:
next(second_f)
second_file_co = second_f.readlines()
for x in second_file_co:
second_file_values.add(x.split(',')[0])
with open("c:\output_file.csv", "a") as out_file:
for x in second_file_values:
if x in first_file_values:
out_file.write(x)
使用 set
进行快速成员资格检查。
此外,无需将整个文件的内容复制到内存中。您可以只遍历文件的剩余内容。
first_entries = set()
with open("c:\first_file.csv") as first_f:
next(first_f)
for line in first_f:
first_entries.add(line.split(',')[0])
with open("c:\second_file.csv") as second_f:
with open("c:\output_file.csv", "a") as out_file:
next(second_f)
for line in second_f:
if line.split(',')[0] in first_entries:
out_file.write(line)
此外,我注意到您对使用 with
语句打开的文件对象调用了 .close()
。使用 with
(上下文管理器)意味着所有清理工作都在您退出其上下文后完成。所以它会为你处理 .close()
。
我有一个包含 4 列分隔值的文件。我只需要第一列,所以我读取了文件,然后将该行拆分,分隔并将其存储在一个名为 first_file_list.
的列表变量中我有另一个文件,其中包含 6 列分隔值。我的要求是读取文件第一行的第一列,并检查字符串是否存在于名为 first_file_list 的列表中。如果存在,则将该行复制到新文件。
我的第一个文件大约有。 600 万条记录和第二个文件有大约。 450 万条记录。只是为了检查我的代码而不是 450 万的性能,我在第二个文件中只放了 100k 条记录,处理这 100k 条记录的代码大约需要。 2.5小时。
以下是我的逻辑:
first_file_list = []
with open("c:\first_file.csv") as first_f:
next(first_f) # Ignoring first row as it is header and I don't need that
temp = first_f.readlines()
for x in temp:
first_file_list.append(x.split(',')[0])
first_f.close()
with open("c:\second_file.csv") as second_f:
next(second_f)
second_file_co = second_f.readlines()
second_f.close()
out_file = open("c:\output_file.csv", "a")
for x in second_file_co:
if x.split(',')[0] in first_file_list:
out_file.write(x)
out_file.close()
能否请您帮助我了解我在这里做错了什么,以至于我的代码需要这么多时间来比较 10 万条记录?或者你能在 Python.
中建议更好的方法吗使用集合 - 见下文
first_file_values = set()
second_file_values = set()
with open("c:\first_file.csv") as first_f:
next(first_f)
temp = first_f.readlines()
for x in temp:
first_file_values.add(x.split(',')[0])
with open("c:\second_file.csv") as second_f:
next(second_f)
second_file_co = second_f.readlines()
for x in second_file_co:
second_file_values.add(x.split(',')[0])
with open("c:\output_file.csv", "a") as out_file:
for x in second_file_values:
if x in first_file_values:
out_file.write(x)
使用 set
进行快速成员资格检查。
此外,无需将整个文件的内容复制到内存中。您可以只遍历文件的剩余内容。
first_entries = set()
with open("c:\first_file.csv") as first_f:
next(first_f)
for line in first_f:
first_entries.add(line.split(',')[0])
with open("c:\second_file.csv") as second_f:
with open("c:\output_file.csv", "a") as out_file:
next(second_f)
for line in second_f:
if line.split(',')[0] in first_entries:
out_file.write(line)
此外,我注意到您对使用 with
语句打开的文件对象调用了 .close()
。使用 with
(上下文管理器)意味着所有清理工作都在您退出其上下文后完成。所以它会为你处理 .close()
。