Я довольно новичок в Python, и я написал (возможно, очень уродливый) скрипт, который должен случайно выбрать подмножество последовательностей из файла fastq. Fastq-файл хранит информацию в блоках по четыре строки. Первая строка в каждом блоке начинается с символа «@». Файл fastq, который я использую в качестве входного файла, составляет 36 ГБ, содержащий около 14 000 000 строк.Как я могу сделать свой скрипт Python быстрее?
Я попытался переписать уже существующий скрипт, который использовал слишком много памяти, и мне удалось значительно сократить использование памяти. Но сценарий длится вечно, и я не понимаю, почему.
parser = argparse.ArgumentParser()
parser.add_argument("infile", type = str, help = "The name of the fastq input file.", default = sys.stdin)
parser.add_argument("outputfile", type = str, help = "Name of the output file.")
parser.add_argument("-n", help="Number of sequences to sample", default=1)
args = parser.parse_args()
def sample():
linesamples = []
infile = open(args.infile, 'r')
outputfile = open(args.outputfile, 'w')
# count the number of fastq "chunks" in the input file:
seqs = subprocess.check_output(["grep", "-c", "@", str(args.infile)])
# randomly select n fastq "chunks":
seqsamples = random.sample(xrange(0,int(seqs)), int(args.n))
# make a list of the lines that are to be fetched from the fastq file:
for i in seqsamples:
linesamples.append(int(4*i+0))
linesamples.append(int(4*i+1))
linesamples.append(int(4*i+2))
linesamples.append(int(4*i+3))
# fetch lines from input file and write them to output file.
for i, line in enumerate(infile):
if i in linesamples:
outputfile.write(line)
Grep шаг не занимает практически нет времени на все, но после более чем 500 минут, сценарий до сих пор не начал писать в выходной файл. Поэтому я полагаю, что это один из шагов между grep и последним for-loop, который занимает такое долгое время. Но я не понимаю, какой именно шаг, и что я могу сделать, чтобы ускорить его.
Вы должны рассмотреть свою [программу] (https://docs.python.org/2/library/profile.html) вашу программу, чтобы увидеть, какие шаги зависают.Также попробовали ли вы запустить свой код в файле меньшего размера и посмотреть, завершено ли оно? Еще один шаг, который я рассмотрел позже в оптимизации, - это использование потоковой обработки и многопроцессорности, чтобы разделить работу. –
Не называть 'int' все время внутри цикла. Также используйте инструкцию 'with'. – Veedrac