python - 有没有办法简化这段代码?

标签 python

我正在做一些生物信息学研究,而且我是 python 的新手。我编写这段代码来解释包含蛋白质序列的文件。文件“bulk_sequences.txt”本身包含 71,423 行信息。三行表示一个蛋白质序列,第一行提供信息,包括发现蛋白质的年份(这就是“/1945”的全部内容)。”对于 1000 行的较小样本,它工作得很好。但是对于我给出的这个大文件,它似乎花费了非常长的时间。我可以做些什么来简化它吗?

它的目的是对文件进行排序,按发现年份排序,然后将所有三行蛋白质序列数据分配给数组“sortedsqncs”中的一项

    import time
    start = time.time()



    file = open("bulk_sequences.txt", "r")
    fileread = file.read()
    bulksqncs = fileread.split("\n")
    year = 1933
    newarray = []
    years = []
    thirties = ["/1933","/1934","/1935","/1936","/1937","/1938","/1939","/1940","/1941","/1942"]## years[0]
    forties = ["/1943","/1944","/1945","/1946","/1947","/1948","/1949","/1950","/1951","/1952"]## years[1]
    fifties = ["/1953","/1954","/1955","/1956","/1957","/1958","/1959","/1960","/1961","/1962"]## years[2]
    sixties = ["/1963","/1964","/1965","/1966","/1967","/1968","/1969","/1970","/1971","/1972"]## years[3]
    seventies = ["/1973","/1974","/1975","/1976","/1977","/1978","/1979","/1980","/1981","/1982"]## years[4]
    eighties = ["/1983","/1984","/1985","/1986","/1987","/1988","/1989","/1990","/1991","/1992"]## years[5]
    nineties = ["/1993","/1994","/1995","/1996","/1997","/1998","/1999","/2000","/2001","/2002"]## years[6]
    twothsnds = ["/2003","/2004","/2005","/2006","/2007","/2008","/2009","/2010","/2011","/2012"]## years[7]

    years = [thirties,forties,fifties,sixties,seventies,eighties,nineties,twothsnds]
    count = 0
    sortedsqncs = []


    for x in range(len(years)):
        for i in range(len(years[x])):
                for y in bulksqncs:
                        if years[x][i] in y:
                            for n in range(len(bulksqncs)):
                                if y in bulksqncs[n]:
                                    sortedsqncs.append(bulksqncs[n:n+3])
                                    count +=1
    print len(sortedsqncs)

    end = time.time()
    print round((end - start),4)

最佳答案

tcaswell 的 itertools.izip_longest() 解决方案非常优雅,但如果您不经常使用更高级别的迭代工具,您可能会忘记它是如何工作的,并且代码将来可能会变得难以理解。

但是 tcaswell 从根本上说是正确的,您循环访问文件的次数太多了。至少从可读性和可维护性的角度来看,其他低效率是预定义的年份数组。此外,您几乎不应该使用 range(len(seq)) —— 几乎总是有更好(更 pythonic)的方法。最后,如果您想要文件中的行列表,请使用 readlines()

一个更行人的解决方案是:

  1. 按照 tcaswell 的建议编写函数 extract_year() 以从输入行 (bulksqncs) 返回年份,如果未找到年份则返回 None。您可以使用正则表达式,或者如果您知道年份在行中的位置,请使用它。

  2. 遍历输入并提取所有序列,将每个序列分配给一个元组(年份,三行序列)并将元组添加到列表中。这也允许输入文件具有散布着序列的非序列。

  3. 按年份对元组列表进行排序。

  4. 从已排序的元组列表中提取序列。

示例代码 - 这将为您提供一个已排序序列的 Python 列表:

bulksqncs = infile.readlines()
sq_tuple = []
for idx, line in enumerate(bulksqncs):
   if extract_year(line):
     sq_tuple.append((extract_year(line), bulksqncs[idx:idx+3]))
sq_tuple.sort()
sortedsqncs = ['\n'.join(item[1]) for item in sq_tuple]

关于python - 有没有办法简化这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18804468/

相关文章:

python - 无法迁移 Django 应用程序 - MySQL 抛出 OperationalError "Too big scale specified"

python - Python 中的更新日期

python - 如何使用 imageio 调整图像大小以获得正确的 ICO 文件?

python - 显示 pyplot 图后隐藏线条

python - 如何使用 numpy.ma.masked_inside

python - 如何根据另一个数组的平均值和标准差生成有界随机数组?

Python 百分比舍入

python - python elasticsearch:如何在所有字段上查询字符串

python - 从 Python 生成和运行 Haskell 代码

python - 如何将 timedelta 与 timezone.now 一起使用为默认值?