【问题标题】:Is there a way to speed up this Python Code I am reading multiple GB of text有没有办法加快这个 Python 代码我正在阅读多 GB 的文本
【发布时间】:2020-05-01 13:04:40
【问题描述】:

我有一个大型数据库作为文本文件(大约 1GB),我试图将信息行作为一行,以便能够对这些行进行一些数据分析。数据库格式如下

>Title 1 Line
Data 1 Line
Data 1 Line
Data 1 line 
>Title 2 Line
Data 2 Line
Data 2 Line
Data 2 Line ....

我希望我的输出是

>Title 1 Line
Data 1 Line
>Title 2 Line
Data 2 Line

这是我的代码:

#opening document using open 
Data = open("Dataset.txt", "r")

#defining file name for lines 

protein = Data.readlines()


#variable defining for rewrite

proteinfinal = ""

for line in protein:
    if ">" in line:
        proteinfinal += line
    else:
        proteinfinal += line.strip("/n")
#removing final and last to remove lines
#print(proteinfinal.strip())
#closing file 
Data.close()

# Make a new file
Data = open("Dataset.txt", "w")
#write to file 
Data.write(proteinfinal)
#close file
Data.close()

有没有办法让它更快地运行这已经运行了一段时间,并且代码在几分钟内就可以在数据集的较小子集(10,000)行上运行。

【问题讨论】:

  • 是的,不要使用protein = Data.readlines(),直接遍历文件对象for line in data: ...,然后,*不要使用连接来增长字符串。即不要使用proteinfinal += line,使用列表proteinlist = [],然后*在循环中追加到该列表,最后在循环结束时使用proteinfinal = ''.join(proteinlist)
  • 你使用的是什么 Python 实现和版本?

标签: python python-3.x


【解决方案1】:

是的,不要使用readlines,直接遍历文件对象。更重要的是,不要使用+= 在循环中增长列表,这会给你二次行为。请尝试以下操作:

protein_parts = []
with open("Dataset.txt", "r") as f:
    for line in f:
        if ">" in line:
            protein_parts.append(line)
        else:
            protein_parts.append(line.strip("\n"))
proteinfinal = ''.join(protein_parts)

注意,在这种特殊情况下,您可以做的最快的事情可能是:

with open("Dataset.txt", "r") as f_in, open("Dataset0.txt", "w") as f_out:
    for line in f_in:
        if ">" in line:
            f_out.write(line)
        else:
            f_out.write(line.strip("\n"))

现在您有两个文件,但如果您必须保留旧名称,只需执行以下操作:

import os
os.remove("Dataset.txt")
os.rename(""Dataset0.txt", "Dataset.txt")

【讨论】:

  • 对于“二次行为”,它的速度非常快。一百万 += 在 0.75 秒内:repl.it/repls/UnevenSpecializedCad
  • @StefanPochmann 它实际上可能不是二次的。根据解释器版本,这实际上会将其更改为线性时间算法,但依赖该行为通常不是一个好主意,因为它很容易被愚弄。编辑:所以请查看:stackoverflow.com/questions/44487537/…
  • 是的,我知道。我只是不喜欢它二次的断言,而它只有可以是二次的。尽管在这种情况下您可能是对的,因为我看不出他们的 10,000 行需要几分钟的任何其他原因。这就是为什么我向他们询问他们的 Python 的原因。也就是说,我发现真正的原因更有可能是他们没有向我们展示真实的代码,而是一个简化的版本。
  • 哦,刚刚看到你的编辑。我还不知道那个。正在阅读...
  • 大声笑。你链接到的那个问题说“我的问题是基于this comment。那条评论是... mine :-D
【解决方案2】:

您可以尝试使用 filesplit 将文件拆分为更小的文件,然后使用 MultiProcessing 来同时完成工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 2021-06-17
    相关资源
    最近更新 更多