提高python脚本的速度

时间:2015-07-09 02:10:24

标签: python

我有一个包含字符串列表的输入文件。

我正在从第二行开始迭代每四行。

从这些行中的每一行开始,我从第一个和最后6个字符创建一个新字符串,并且仅当新字符串是唯一的时才将其放在输出文件中。

我写的代码可以解决这个问题,但是我正在使用非常大的深度序列文件,并且已经运行了一天并且没有取得多大进展。所以我正在寻找任何建议,如果可能的话,这样做会更快。感谢。

def method():
    target = open(output_file, 'w')

    with open(input_file, 'r') as f:
        lineCharsList = []

        for line in f:
            #Make string from first and last 6 characters of a line
            lineChars = line[0:6]+line[145:151] 

            if not (lineChars in lineCharsList):
                lineCharsList.append(lineChars)

                target.write(lineChars + '\n') #If string is unique, write to output file

            for skip in range(3): #Used to step through four lines at a time
                try:
                    check = line    #Check for additional lines in file
                    next(f)
                except StopIteration:
                    break
    target.close()

4 个答案:

答案 0 :(得分:6)

尝试将lineCharsList定义为set而不是列表:

lineCharsList = set()
...
lineCharsList.add(lineChars)

这将提高in运算符的性能。此外,如果内存根本不是问题,您可能希望在列表中累积所有输出并在结尾处全部写入,而不是执行多个write()操作。

答案 1 :(得分:5)

您可以使用https://docs.python.org/2/library/itertools.html#itertools.islice

import itertools

def method():
    with open(input_file, 'r') as inf, open(output_file, 'w') as ouf:
        seen = set()
        for line in itertools.islice(inf, None, None, 4):
            s = line[:6]+line[-6:]
            if s not in seen:
                seen.add(s)
                ouf.write("{}\n".format(s))

答案 2 :(得分:2)

除了使用 java.lang.IllegalArgumentException: Date/timestamp is outside valid range at io.realm.internal.UncheckedRow.setDate(UncheckedRow.java:201) at io.realm.ProjectRealmProxy.setExpiry(ProjectRealmProxy.java:92) at io.realm.ProjectRealmProxy.copy(ProjectRealmProxy.java:238) at io.realm.ProjectRealmProxy.copyOrUpdate(ProjectRealmProxy.java:229) at io.realm.DefaultRealmModuleMediator.copyOrUpdate(DefaultRealmModuleMediator.java:123) at io.realm.Realm.copyOrUpdate(Realm.java:1565) at io.realm.Realm.copyToRealm(Realm.java:1116) 作为Oscar建议之外,您还可以使用islice跳过行而不是使用for循环。

this post中所述,islice在C中预处理迭代器,因此它应该比使用普通的vanilla python for循环快得多。

答案 3 :(得分:1)

尝试替换

lineChars = line[0:6]+line[145:151]

lineChars = ''.join([line[0:6], line[145:151]])

因为它可以更有效率,具体取决于具体情况。