我需要帮助来改善脚本的执行时间。
它会做应做的事情:
问题在于执行时间,该文件有超过500,000行,而json文件包含更多行。
如何优化此脚本?
import json
import time
start = time.time()
print start
JsonFile=open('categories.json')
data = json.load(JsonFile)
Annotated_Data={}
FileList = [line.rstrip('\n') for line in open("FilesNamesID.txt")]
for File in FileList:
for key, value in data.items():
if File == key:
Annotated_Data[key]=(value)
with open('Annotated_Files.txt', 'w') as outfile:
json.dump(Annotated_Data, outfile, indent=4)
end = time.time()
print(end - start)
答案 0 :(得分:2)
嵌套的循环无需在File
中查找data
。您可以将其替换为以下代码:
for File in FileList:
if File in data:
Annotated_Data[File]=data[File]
或具有理解力:
AnnotatedData = {File: data[File] for File in FileList if File in data}
您还可以避免将整个FilesNamesID.txt的内容复制到新列表中-仍然逐行使用它-但这是相对较小的改进。
答案 1 :(得分:1)
我不知道您的数据的确切格式,但是您可以尝试使用set()
来加速脚本:
json_data = '''
{
"file1": "data1",
"file2": "data2",
"file3": "data3"
}
'''
filenames_id_txt = '''
file1
file3
'''
import json
data = json.loads(json_data)
lines = [l.strip() for l in filenames_id_txt.splitlines() if l.strip()]
s = set(data.keys())
Annotated_Data = {k: data[k] for k in s.intersection(lines)}
print(json.dumps(Annotated_Data))
打印:
{"file3": "data3", "file1": "data1"}
编辑:如果我正确理解了您的问题,则希望在JSON数据和TXT文件中的行之间找到“交集”。
我选择了set()
(doc)来存储JSON密钥(集合是唯一元素的集合)。 set()
具有非常快速的方法,其中一个方法是intersection()
(doc),该方法接受其他迭代器(例如TXT文件中的行)并返回带有公共元素的新集合。
我使用这个新集合来构造新字典并将其输出为JSON文件。