• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JoaoRodrigues

Esforço Mental: optimizar um pedaço de código sem o testar

4 mensagens neste tópico

Boas malta! Acabei agora um script que me vai dar um jeitaço no meu estágio mas acho que pode ser melhorado :D Vinha-vos pedir sugestões. O problema é que isto tem dependências trabalhosas (BioPython, EMBOSS NEEDLE, só corre em linux, etc) e por isso duvido que algum de vós tenha pachorra de o testar. Daí, vinha-vos pedir sugestões meramente teóricas, que eu encarrego-me de testar :)

http://paste.portugal-a-programar.org/pastebin.php?show=2990

(200 linhas +/-)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Utiliza um profiler. É a melhor maneira de ter a certeza quais são os pedaços de código que precisam de ser optimizados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Da linha 151 a 158, estares sempre a repetir o mesmo código no if vai-te obrigar a correr aquilo sempre. Usa uma variável temporal.

De resto, à primeira vista não vejo nada. Usa um profiler, como o Triton sugeriu.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, decidi usar o tal profiler mas não entendi patavina dos resultados daquilo :x

De qualquer maneira, essas linhas que o djthyrax sugeriu acabaram mesmo por mudar porque arranjei uma alternativa a essa função:

Antes

needleDetails = {}
    seqAlignment = ''

    for line in fileData:
        if line[0] == '#':

            if line[2:].split(':')[0] == 'Length':
                needleDetails["Length"] = line.split(':')[1].strip()
            elif line[2:].split(':')[0] == 'Identity':
                needleDetails["Identity"] = line.split(':')[1].strip()
            elif line[2:].split(':')[0] == 'Similarity':
                needleDetails["Similarity"] = line.split(':')[1].strip()
            elif line[2:].split(':')[0] == 'Gaps':
                needleDetails["Gaps"] = line.split(':')[1].strip()
        elif line[0] == '>': # New sequence
            name = line.split()[0][1:]
            seqAlignment += "\n>%s\n" %name
        elif len(line)>10: # Alignment Lines
            seqAlignment += "%s" %line

Depois

infoRegex = re.compile('.Length:.(\d+)\s# Identity:\s+([\d/\(\)\.% ]+)\s# Similarity:\s+([\d/\(\)\.% ]+)\s# Gaps:\s+([\d/\(\)\.% ]+)\s# Score:\s+([\d\.]+)')
needleNumbers = re.findall(infoRegex, needleResults)

alignment = '\n'.join([line for line in needleResults.split('\n') if len(line)>1 and line[0] != '#' and line[0] != ';'])

A diferença deveu-se também a eu ter mudado ligeiramento o formato do ficheiro que me dava os dados para fazer o parsing.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora