Python 快速重新排列文本文件

Python 快速重新排列文本文件,python,multithreading,text,file-io,parallel-processing,Python,Multithreading,Text,File Io,Parallel Processing,我编写了以下代码以按给定顺序重写文本文件。此顺序在gA中指定gA是一个列表:[[fN0,value0],[fN1,value1]…]。我按值对这个列表进行了排序,并希望按照这个顺序写出 我的代码工作正常,但输入速度非常慢(我有一个5000万行的输入,需要2个月的时间来处理)。因此,我正在寻找方法来加快这一代码。任何想法都欢迎 for k in gA: fN = k[0] for lineNum, line in enumerate(slicedFile,start=0):

我编写了以下代码以按给定顺序重写文本文件。此顺序在
gA
中指定
gA
是一个列表:
[[fN0,value0],[fN1,value1]…]
。我按值对这个列表进行了排序,并希望按照这个顺序写出

我的代码工作正常,但输入速度非常慢(我有一个5000万行的输入,需要2个月的时间来处理)。因此,我正在寻找方法来加快这一代码。任何想法都欢迎

for k in gA:
    fN = k[0]
    for lineNum, line in enumerate(slicedFile,start=0):
        num, restOfLine = line.split('\t',1)
        if num == fN:
            out.write(line)
    inp.seek(0)

您应该将整个文件读入内存,并将所有行放在
num
dict
中,指向开头有
num
行的
列表。然后,您可以在
gA
中迭代一次,并打印该
dict
中的所有行:

from collections import defaultdict

lines = defaultdict(list)
for line in slicedFile:
  num, restOfLine = line.split('\t', 1)
  lines[num].append(line)

for fN, dummy in gA:
  for line in lines[fN]:
    out.write(line)

注意:我使用
defaultdict
只是为了缩短代码。如果在这样一个
defaultdict
中使用了一个不存在的元素,它会自动创建(在本例中是一个
list
),因此我可以在元素上调用
.append()

gA
的意义是什么?您不是只想根据
num
的值对文件中的行进行排序吗?为什么要
enumerate()
?您没有使用
lineNum
。这是故意的还是我指的是你想改变的东西?@JayanthKoushik实际上,num的值是不同行的ID(每行都以num开头,这是我识别它们的方式)@Alfe要诚实,我列举,因为我习惯这样做。否则您将如何继续?如果您不需要计算,只需对slicedFile中的line使用
而不是对enumerate(slicedFile,start=0)中的lineNum使用