EPx professional blog and repository for braindumps

2010/03/07

Um pequeno teste com o Unladen Swallow

Tenho trabalhado num novo livro sobre opções, desta vez com um enfoque muito mais prático que o anterior. Uma ferramenta que estou desenvolvendo para fundamentar o texto (além da experiência empírica, com que a crise de 2008 nos "presenteou") é a simulação de estratégias.

O programa simulador é escrito em Python. Dados os parâmetros, o aplicativo simula um grande número de operações (geralmente 100 mil) e devolve rentabilidade. Segue um exemplo de rodada de simulação:


Milhares de combinações de parâmetros são simuladas; a saída acima foi apenas uma delas. Para facilitar a análise da massa de dados, os dados são jogados num gráfico como o exemplo abaixo (feito em Tkinter):


Cada rodada de simulação vira apenas seis pontos nesse gráfico -- um de cada cor. São 5000 combinações, 100.000 operações por combinação. E para cada operação, é preciso simular cada dia, de modo a testar a estratégia com "gaps", "stops", e toda essa baboseira de investimento.

Logo ficou claro que, com o Python padrão, ia demorar semanas para gerar a massa de dados. Aí lembrei do Pysco, aquele compilador JIT. Com ele, consegui um ganho médio de 4 vezes na performance:


Assim, o que ia levar uma semana, passa a levar um dia. (Também tirei partido do fato do computador ter 2 processadores, o que permite o teste simultâneo de 2 combinações, traduzindo num ganho total de 8x). O mais atraente do Pysco é a incrível simplicidade de aplicação num programa convencional. Bastam duas linhas no início:


(Ao fundo, pode-se ver o vídeo do YouTube que eu estava vendo quando tirei os snapshots.)

Também adicionei estas linhas no programa gerador gráfico. O ganho de performance foi menos estelar, mas ainda assim palpável, certamente eu usaria o Unladen se o Psyco não estivesse à mão.

Nos últimos dias, ouvimos falar muito do Unladen Swallow, o projeto do Google para adicionar JIT ao interpretador Python, mas já trabalhando a coisa (tecnica e politicamente) para integração ao Python "baunilha".

Compilei a versão trunk do Unladen, e funcionou normalmente com meu aplicativo:


O ganho foi em torno de 1.6x. Menos que o Psyco, mas ainda assim considerável. Detalhe: o Unladen otimiza em qualquer arquitetura suportada pelo LLVM. O executável Python do exemplo acima é 64 bits real, enquanto o Python padrão do Snow Leopard tem de ser configurado para 32 bits para funcionar com o Psyco, já que este último só "cospe" código i386.

Não consegui compilar o Unladen para 32 bits, o que permitiria uma comparação mais justa (vai que o LLVM para i386 esteja mais otimizado). De qualquer forma, é bom ver um projeto de otimização Python no caminho certo, e melhor ainda se eles conseguirem eliminar o GIL, conforme estão prometendo.

2 comentários:

tfmoraes disse...

Você poderia testar com o Pypy também. Já tem até pacote pronto para o Ubuntu https://launchpad.net/~pypy/+archive/ppa/+packages

EPx disse...

Fiz isso num post depois deste (está em inglês - Small test with PyPy 1.2)

Postar um comentário