Код для сравнения двух файлов - медленный - ищите, чтобы улучшить мой код - PullRequest
1 голос
/ 08 января 2020

Я не специалист по Python, и я пишу скрипт для сравнения двух файлов (данные о землетрясениях). То, что я написал, довольно уродливо и очень медленно. У кого-нибудь есть идея улучшить мой код? Спасибо!

#!/usr/bin/env python
# -*- coding: utf-8 -*-

file_1 = 'Loc_1D.txt'
file_2 = 'Loc_3D.txt'
output_file = 'result_file.txt'

with open(file_1, "r") as f1:
    for line1 in f1:
        yr1, mth1, d1, hr1, m1, s1, lat1, lon1, z1, mag  = line1.split()
        time1 = [yr1, mth1, d1, hr1, m1]
        with open(file_2, "r") as f2:
            for line2 in f2:
                yr2, mth2, d2, hr2, m2, s2, lat2, lon2, z2, *_ = line2.split()
                time2 = [yr2, mth2, d2, hr2, m2]
                with open(output_file, "w") as oup:
                    if time1 == time2 and abs(float(s1)-float(s2)) <= 2:
                        Event = [yr2, mth2, d2, hr2, m2, s2, lat2, lon2, z2, mag]
                        print (Event)
                        oup.write(str(Event))

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Это исправление, благодаря @Samay Gupta

file_1 = 'Loc_1D.txt'
file_2 = 'Loc_3D.txt'
output_file = 'result_file.txt'

with open(file_1) as f1:
    f1_data = {}
    for line in f1.read().split("\n"):
        line_data = line.split()
        f1_data["-".join(map(str, line_data[:5]))] = line_data

with open(file_2) as f2:
    f2_data = {}
    for line in f2.read().split("\n"):
        line_data = line.split()
        f2_data["-".join(map(str, line_data[:5]))] = line_data

output_data = []
for data_key in [key for key in f1_data.keys() if key in f2_data.keys()]:
    if abs(float(f1_data[data_key][5])-float(f2_data[data_key][5])) <= 2.0:
        Event = f2_data[data_key][:9], f1_data[data_key][9]
        print(Event)
        output_data.append(Event)

with open(output_file, 'w') as f:
    f.write("\n".join(str(output_data)))
0 голосов
/ 08 января 2020

Это похоже на комментарий Мэтта. Предполагая, что отметка времени уникальна во всех случаях, это может быть наиболее эффективным решением:

file_1 = 'Loc_1D.txt'
file_2 = 'Loc_3D.txt'
output_file = 'result_file.txt'
with open(file_1) as f1:
    f1_data = {}
    for line in f1.read().split("\n"):
        line_data = line.split()
        f1_data["-".join(map(str, line_data[:5]))] = line_data

with open(file_2) as f2:
    f2_data = {}
    for line in f2.read().split("\n"):
        line_data = line.split()
        f2_data["-".join(map(str, line_data[:5]))] = line_data

output_data = []
for data_key in [key for key in f1_data.keys() if key in f2_data.keys()]:
    if abs(float(f1_data[data_key][5])-float(f2_data[data_key][5])) <= 2.0:
        Event = str(f2_data[data_key][5])
        print(Event)
        output_data.append(Event)

with open(output_file, 'w') as f:
    f.write("\n".join(output_data))

Причина в том, что если вы рассматриваете с точки зрения эффективности использование обозначений Big O, вы переходите от O (n ^ 2) к эффективности O (3n). Проще говоря, количество итераций уменьшается. например, если в каждом файле содержится, скажем, 100 строк данных, компьютер должен будет обработать около 10000 в предыдущем случае и 300 в этом случае.

...