我正在做一些生物信息学研究,而且我是 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()
。
一个更行人的解决方案是:
按照 tcaswell 的建议编写函数 extract_year() 以从输入行 (bulksqncs) 返回年份,如果未找到年份则返回 None。您可以使用正则表达式,或者如果您知道年份在行中的位置,请使用它。
遍历输入并提取所有序列,将每个序列分配给一个元组(年份,三行序列)并将元组添加到列表中。这也允许输入文件具有散布着序列的非序列。
按年份对元组列表进行排序。
从已排序的元组列表中提取序列。
示例代码 - 这将为您提供一个已排序序列的 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/