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

Sign in to follow this  
JoaoRodrigues

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

Recommended Posts

JoaoRodrigues

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 +/-)

Share this post


Link to post
Share on other sites
Triton

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


<3 life

Share this post


Link to post
Share on other sites
djthyrax

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.


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
JoaoRodrigues

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.