需要帮助以改善使用嵌套循环和json文件的Python脚本性能

时间:2019-06-25 21:18:54

标签: python json

我需要帮助来改善脚本的执行时间。

它会做应做的事情:

  • 逐行读取文件
  • 将行与json文件的内容匹配
  • 将两条匹配的行以及来自json文件的相应信息写入新的txt文件

问题在于执行时间,该文件有超过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)

2 个答案:

答案 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文件。