我编写了一个代码以将文本文件作为输入并仅打印重复多次的变体。我所说的变体是指文本文件中的 chr 位置。
输入文件如下所示:
chr1 1048989 1048989 AG intronic C1orf159 0.16 rs4970406
chr1 1049083 1049083 CA intronic C1orf159 0.13 rs4970407
chr1 1049083 1049083 CA intronic C1orf159 0.13 rs4970407
chr1 1113121 1113121 GA intronic TTLL10 0.13 rs12092254
如您所见,第 2 行和第 3 行重复。我只是取前 3 列,看看它们是否相同。在这里,chr1 1049083 1049383 在 row2 和 row3 中重复。所以我打印出来说有一个重复,它的位置。
我已经写了下面的代码。虽然它正在做我想要的,但它很慢。在一个有 700,000 行的文件上运行大约需要 5 分钟。我想知道是否有办法加快速度。
谢谢!
#!/usr/bin/env python
""" takes in a input file and
prints out only the variants that occur more than once """
import shlex
import collections
rows = open('variants.txt', 'r').read().split("\n")
# removing the header and storing it in a new variable
header = rows.pop()
indices = []
for row in rows:
var = shlex.split(row)
indices.append("_".join(var[0:3]))
dup_list = []
ind_tuple = collections.Counter(indices).items()
for x, y in ind_tuple:
if y>1:
dup_list.append(x)
print dup_list
print len(dup_list)
注意:在这种情况下,整个 row2 是 row3 的副本。但这并不一定总是如此。我正在寻找重复的 chr 位置(前三列)。
编辑:根据 damienfrancois 的建议编辑了代码。以下是我的新代码:
f = open('variants.txt', 'r')
indices = {}
for line in f:
row = line.rstrip()
var = shlex.split(row)
index = "_".join(var[0:3])
if indices.has_key(index):
indices[index] = indices[index] + 1
else:
indices[index] = 1
dup_pos = 0
for key, value in indices.items():
if value > 1:
dup_pos = dup_pos + 1
print dup_pos
我用了,时间来看看这两个代码需要多长时间。
我的原始代码:
time run remove_dup.py
14428
CPU times: user 181.75 s, sys: 2.46 s,total: 184.20 s
Wall time: 209.31 s
修改后的代码:
time run remove_dup2.py
14428
CPU times: user 177.99 s, sys: 2.17 s, total: 180.16 s
Wall time: 222.76 s
我没有看到任何显着的改善。