Как я могу сделать это более эффективным?Python DNA Generator - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть код, который генерирует ДНК, а затем много раз реплицирует цепочку ДНК, а затем разрезает каждую строку в случайной точке.Мне нужно иметь возможность генерировать по крайней мере 20 тыс. Строк, но это займет 30 минут.Мне было интересно, есть ли способ сделать этот код более эффективным?Спасибо

import sys
import numpy as NP
import fileinput
import re
import random

#Generate Random DNA Sequence

def random_dna_sequence(length):
    return ''.join(random.choice('ACTG') for each in range(length))
#DNA sequences with equal base probability

def base_frequency(dna):
    D = {}
    for base in 'ATCG':
        D[base] = dna.count(base)/float(len(dna))
    return D

for each in range(1):
    dna = random_dna_sequence(300)
    f= open("GeneratedDNA.txt", "w+")
    print(dna, file=f)
    f.close()
    f= open("OrigionalStrand.txt", "w+")
    print(dna, file=f)
    f.close()

Value =int(input("Enter How Many Replica Strands You Want to Generate: "))
for x in range(Value):
    with open("GeneratedDNA.txt") as f_in, open("GeneratedDNA.txt", "a") as f_out :
        for row in f_in.readlines()[-1:] :
            f_out.write(row)
            f_out.close()

min_no_space = 55 #minimum length without spaces
max_no_space = 75 # max sequence length without space
no_space = 0
with open("GeneratedDNA.txt","r") as f, 
open("GeneratedShortReads.txt","w") as w: 
    for line in f:
        for c in line:
            w.write(c)
            if no_space > min_no_space:
                if random.randint(1,9) == 1 or no_space >= max_no_space:
                    w.write("\n")
                    no_space = 0
            else:
                no_space += 1
    f.close()
    w.close()

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Если вы просто пытаетесь генерировать короткие чтения (например, Illumina или аналогичные) из последовательности ДНК, попробуйте это, это намного быстрее, чем ваш код

import numpy as np
def random_dna_sequence(length):
    return ''.join(random.choice('ACTG') for each in range(length))

Мы начнем со случайной ДНКпоследовательность длиной 500 000 п.н.Исходя из этого, мы сделаем 20000 коротких операций чтения со средней длиной 60 б.п. со стандартным отклонением 10 б.п.:

seq_len = 500000
mean_read_length = 60
read_length_sd = 10
num_reads = 20000

my_dna = random_dna_sequence(seq_len)

# Generate random read lengths
read_lengths = [int(x) for x in np.random.normal(mean_read_length,read_length_sd,num_reads)]

# Generate random offsets
offsets = np.random.randint(0,seq_len,num_reads)

# Make the reads
reads = [my_dna[offset:offset+length] for offset,length in zip(offsets,read_lengths)]

# Add code to write reads to file ...
0 голосов
/ 26 ноября 2018
  1. Не открывайте и не закрывайте файл в цикле, вместо этого загрузите данные файла в переменную в начале кода, запишите результат в другую переменную и запишите его в файл в конце кода.
  2. Получение случайных данных часто обходится дорого.Вы можете загрузить как 1000 случайных чисел один раз, а затем использовать их в качестве генератора случайных чисел.
  3. Используйте PyPy в качестве интерпретатора, он работает в 6 раз быстрее, чем CPython: https://pypy.org/
  4. Если это не такдостаточно использовать более быстрый язык, чем Python.Я предлагаю Голанг или C ++: https://dev.to/albertdugba/go-or-python-and-why-58ob
...