【问题标题】:Code to compare two files is to slow - search to improve my code比较两个文件的代码很慢 - 搜索以改进我的代码
【发布时间】:2020-01-08 09:08:45
【问题描述】:

我不是 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))

【问题讨论】:

  • 您正在为 file_1 中的每一行打开 file_2。将每个文件打开一次,然后将这些行解析为 2 个以时间为键的字典。
  • 谢谢,我试了下,不行,只写了一行(我写在下面)

标签: python performance loops compare text-files


【解决方案1】:

这类似于马特的评论。假设时间戳在所有情况下都是唯一的,这可能是最有效的解决方案:

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))

原因是如果您考虑使用大 O 表示法的效率,您正在从 O(n^2) 转换为 O(3n) 效率。 简单来说就是迭代次数减少。例如,如果每个文件有 100 行数据,则计算机必须在前一种情况下处理大约 10000 行,在这种情况下处理 300 行。

【讨论】:

  • 非常感谢。似乎有语法错误:File "./comp_time_test2.py", line 22 for data_key in [key for key f1_data.keys() if key in f2_data.keys()]: ^ SyntaxError: invalid syntax
  • 什么是大 O 符号?
  • @OcéF 是的,我错过了,我更正了代码,现在应该可以工作了。大 O 符号只是衡量程序效率的一种方法。这是一个估计值,但可以很好地了解代码将如何运行(与时间和计算机资源有关)。这取决于运行时间,较低的 n 值效率更高,速度更快。
  • 感谢您提供这些信息。看来还是有些问题。显然 f1.read.split(\n) 不能有 split 属性。 ` 文件“./comp_time_test2.py”,第 11 行,在 中,用于 f1.read.split("\n") 中的行:AttributeError: 'builtin_function_or_method' 对象没有属性 'split' `
  • 也解决了这个问题,我错过了几个括号。希望现在可以工作?
【解决方案2】:

这是更正,感谢@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)))

【讨论】:

  • 所以一个文件中没有两个事件在同一分钟发生?为什么你没有在问题中这么说?
  • 因为这不是我的问题。我的问题是找到一种方法让我的脚本更快。所以事件发生在同一分钟,我比较了几秒钟。
  • 呃,不,在很多情况下,您可能会不再比较秒数,因为在您进行秒数比较之前,您已经将条目扔掉了,因为微小的碰撞。
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
相关资源
最近更新 更多