python - 代码运行缓慢 - 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 中执行此操作的更好方法。
解决方案
使用 aset
进行快速成员资格检查。此外,无需将整个文件的内容复制到内存中。您可以迭代文件的剩余内容。
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)
此外,我注意到您调用了使用该语句.close()
打开的文件对象。with
使用with
(上下文管理器)意味着在您退出其上下文后完成所有清理工作。所以它.close()
为你处理。
推荐阅读
- python - 如何在 python 的 html 邮件中嵌入图像?
- php - 选择子查询错误子查询返回超过 1 行
- xml - XQuery 从 XML 文件中删除所有具有属性 onlyChannels="print" 的元素
- ethereum - 找出 ERC20 合约中的地址
- r - R - 数据帧行上的函数错误 True/False
- python - 是否可以在vscode中进入Python shell?
- arrays - 获取带有答案的评论列表
- c# - EntryPointNotFoundException:无法在 DLL“onnxruntime”中找到名为“OrtGetApiBase”的入口点
- python - 无法用另一个相同大小的数组替换元组内的数组 - Python
- shipping - WIX 运输选项显示为列表而不是下拉列表