【问题标题】:python - What is the fastest way to replace lines of a file from a dictionary?python - 从字典中替换文件行的最快方法是什么?
【发布时间】:2018-06-14 15:35:09
【问题描述】:

我有 1K 个文件,每个文件有 1M 行。 我有一个字典,它有大约 2M 键并将它们分配给从 1 到 2M 的 2M 唯一数字。所以条目如下:

dictionary = {
    'hakuchita.mutikama' : 3,
    'mitiputu.mitanata' : 4,
    'pulasika.rukayota' : 1,
    'luschi.rulu.pitana' : 2
}

每个文件的每一行都是这些键之一。我想用它们的值替换所有这些键。

这是我的代码:

for filename in os.listdir('data'):
    with fileinput.FileInput('data/' + filename, inplace=True) as file:
        for line in file:
            print(dictionary[line[:-1]])

但我刚刚运行了我的代码,这需要很长时间。

完成这项工作的最快方法是什么?

【问题讨论】:

  • 不要从每行输入中删除换行符,而是在字典键中添加换行符。这将节省十亿次切片操作。
  • @chepner 好点。谢谢!实际上是 2B,因为我也将它们从字典中删除了!大声笑。
  • 定义“年龄”。
  • @StefanPochmann 从 Piacenzian 到 Zanclean。

标签: python performance dictionary io mapping


【解决方案1】:

您可以一次完成,而不是一一获取每个键并单独调用字典。假设您的一个文本文件包含以下内容:

hakuchita.mutikama
mitiputu.mitanata
luschi.rulu.pitana

一次获取所有密钥:

with open("sampleText.txt","r") as f:
    keys = f.read().splitlines()

这是你在 OP 中的字典:

dictionary = {
    'hakuchita.mutikama' : 3,
    'mitiputu.mitanata' : 4,
    'pulasika.rukayota' : 1,
    'luschi.rulu.pitana' : 2
}

立即获取所有值:

values = [dictionary[e] for e in keys]

结果:

[3, 4, 2]

现在,正如@chepner 在他的评论中出色指出的那样,如果你这样做:

dictionary = dict([(k+'\n',v) for k,v in dictionary.items()])

你可以去掉上面代码中的.splitlines(),使用keys = f.readlines()读取文件,节省.splitlines()的时间。正如@JuanAntonio 所提到的,您可以通过并行处理来优化整个过程。

【讨论】:

  • 如果你去掉splitlines,你就不能按原样使用列表解析,因为e在每次迭代中都是一个字符而不是一个完整的键。
  • @chepner 当然,感谢您指出这一点。在这种情况下,阅读应该更改为f.readlines(),我现在将其包含在我的编辑中。
【解决方案2】:

您可以使用multiprocessing python 包来简化线程(以及其他)来加速您的代码。

Here你可以看到一个很好的帖子正在谈论和一些videos

【讨论】:

    【解决方案3】:

    速度变慢是因为您正在逐行写入。而是将所有数据写入一个字符串(100 万行应该仍然可以存储在内存中),然后一次性写出文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2020-06-05
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多