我正在开发一个python vcf到EIGENSTRAT格式的转换器。我有一个代码,它工作得很好,但是它非常慢,所以我不能在项目中真正使用它。我从vcf.gz读取基因型数据,并使用此代码将其转换为.geno格式
import allel
import pandas as pd
import numpy as np
import os
callset = allel.read_vcf("/DATABASES/1KGphase3VCF/ftp.1000genomes.ebi.ac.uk/vol1/ftp/release/20130502/ALL.chr22.phase3_shapeit2_mvncall_integrated_v5b.20130502.genotypes.vcf.gz")
geno = (callset['calldata/GT'])
index = list(callset['variants/POS'])
samples = list(callset['samples'])
df = pd.DataFrame(columns=samples)
# df["Index"] = index
# df = df.set_index('Index')
geno_list = []
for i in range(0, len(geno[:, 0])):
for k in range(0, len(geno[1, :])):
if geno[i, k, 0] == 0 and geno[i, k, 1] == 0:
geno_list.append(2)
elif geno[i, k, 0] == 1 and geno[i, k, 1] == 0 or geno[i, k, 0] == 0 and geno[i, k, 1] == 1:
geno_list.append(1)
elif geno[i, k, 0] == 1 and geno[i, k, 1] == 1:
geno_list.append(0)
else:
geno_list.append(9)
df.loc[i] = geno_list
geno_list = []
numpy_array = df.to_numpy()
NEWLINE_SIZE_IN_BYTES = -1 # on linux -2 on Windows?
with open('test_chr22.geno', 'wb') as fout: # Note 'wb' instead of 'w'
np.savetxt(fout, numpy_array, delimiter="", fmt='%d')
fout.seek(NEWLINE_SIZE_IN_BYTES, 2)
fout.truncate()
有没有办法让这段代码更快?这个vcf.gz大约需要10-12个小时才能转换,这是最小的一个。calldata/GT是一个150万x 2500 x 2的阵列。 先谢谢你
有几种方法可以加速代码并简化某些计算:
测试时间:
只要用
numpy
重写代码,我们就可以看到几乎2的加速。包括numba
的jit编译,我们可以实现约1500的加速相关问题 更多 >
编程相关推荐