Olá, pessoal.Eu estou treinando para uma olimpíada de
programação que terá em meu estado e resolvi resolver os problemas
em Python.Muitos vão dizer que a melhor linguagem para se utilizar em
uma competição deste tipo é C ou C++. No entanto, preferi Python
pela sua simplicidade e poder.Nas últimas semanas eu venho resolvendo
problemas do http://br.spoj.pl <http://br.spoj.pl/> e em alguns casos,
encontrei bastante dificuldade por causa da lentidão do Python. Os
programas têm que passar em tempos apertados (<= 1s) e este está
sendo meu grande problema.Já estou usando em meus programas as
funções de E/S sys.stdin.readline() e sys.stdout.write(), a
função map() em muitos casos e outros artifícios para otimizar meu
código.Também estou usando o psyco para compilar, no entanto,
não sei se ele será permitido na competição em que eu vou
participar.Portanto, se alguém conhece algumas dicas para otimizar o
código em Python que preferencialmente utilizem os módulos e
funções que fazem parte da linguagem (nada de terceiros), por favor,
me ensine.Desde já, agradeço a ajuda de todos.
[As partes desta mensagem que não continham texto foram removidas]
Luiz Augusto,
cara...dá uma olhada no regulamento. Algumas competições só permitem algumas
linguagens e algumas outras não levam desempenho em conta. Muito dessa tua
preocupação pode acabar sendo sem sentido (se performance for irrelevante ou
caso Python não seja aceito).
Se fores olhar pelo campeonato promovido pela SBC (
http://maratona.ime.usp.br/regras11.html) não há Python como disponível e a
performance não conta como fator.
[As partes desta mensagem que não continham texto foram removidas]
2011/4/18 luizaugustomm <no_r...@yahoogrupos.com.br>:
> (..)
> sendo meu grande problema.Já estou usando em meus programas as
> funções de E/S sys.stdin.readline() e sys.stdout.write(), a
> função map() em muitos casos e outros artifícios para otimizar meu
> código. (..)
Não sou grande especialista em Python, mas a espera por I/O
costuma ser bastante custosa no tempo total de execução.
Não sei o que você está escrevendo, mas se você tem muito
I/O no seu script, se puder utilizar here document[1] ao invés
da escrita na saída padrão já deve melhorar.
Agora leve em conta a consideração do Artus, também.
Atts.
[1] http://en.wikipedia.org/wiki/Here_document#Python
--
MARCELO F ANDRADE
Belem, Amazonia, Brazil
"I took the red pill"
Lá no site mesmo tem uma explicação sobre otimização em códigos python
http://br.spoj.pl/forum/viewtopic.php?f=9&t=6902
----------------------------------------------------------
Jayme Proni Filho
Skype: jaymeproni
Twitter: @jaymeproni
Phone: +55 - 17 - 3631 - 6576
Mobile: +55 - 17 - 9605 - 3560
e-Mail: jaymeproni at yahoo dot com dot br
Blogs (Em construção)
Programandor: http://jaymeproni.wordpress.com
Sociedade em Ação: http://sociedaemacao.wordpress.com
----------------------------------------------------------
[As partes desta mensagem que não continham texto foram removidas]
Só complementando o que não está no link que o Jayme passou,
> Já estou usando em meus programas as
> funções de E/S sys.stdin.readline() e sys.stdout.write(), a
> função map() em muitos casos e outros artifícios para otimizar meu
> código.
O uso de funções map, filter, etc.. só é mais rápido (comparado com for comprehensions) quando usadas com funções built-ins do python, ex:
map(int, minhaLista)
De qualquer forma o ganho não é muito grande. Então a melhor opção é ficar no for comprehension.
[]'s
--- Em python...@yahoogrupos.com.br, Jayme Proni Filho <listas.programacao@...> escreveu
>
> Lá no site mesmo tem uma explicação sobre otimização em códigos python
>
> http://br.spoj.pl/forum/viewtopic.php?f=9&t=6902
>
>
> ----------------------------------------------------------
> Jayme Proni Filho
> Skype: jaymeproni
> Twitter: @jaymeproni
> Phone: +55 - 17 - 3631 - 6576
> Mobile: +55 - 17 - 9605 - 3560
> e-Mail: jaymeproni at yahoo dot com dot br
> Blogs (Em construção)
> Programandor: http://jaymeproni.wordpress.com
> Sociedade em Ação: http://sociedaemacao.wordpress.com
> ----------------------------------------------------------
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
Jayme e Renato. Muito obrigado pelas dicas.
Eu já tinha dado uma olhada nestas sugestões propostas pelo pessoal do SPOJ. Elas são bastante úteis.
Agora isso que o Renato falou da função map() eu ainda não sabia. Eu já tinha lido que a função map() era mais rápida que o for, mas não sabia que isto só era válido para funções built-in.
É vivendo e aprendendo... rsrs..
Obrigado mesmo, pessoal.
--- Em python...@yahoogrupos.com.br, "Renato Pereira" <renato.ppontes@...> escreveu
>
> Só complementando o que não está no link que o Jayme passou,
>
> > Já estou usando em meus programas as
> > funções de E/S sys.stdin.readline() e sys.stdout.write(), a
> > função map() em muitos casos e outros artifícios para otimizar meu
> > código.
>
> O uso de funções map, filter, etc.. só é mais rápido (comparado com for comprehensions) quando usadas com funções built-ins do python, ex:
>
> map(int, minhaLista)
>
> De qualquer forma o ganho não é muito grande. Então a melhor opção é ficar no for comprehension.
>
> []'s
>
> --- Em python...@yahoogrupos.com.br, Jayme Proni Filho <listas.programacao@> escreveu
> >
> > Lá no site mesmo tem uma explicação sobre otimização em códigos python
> >
> > http://br.spoj.pl/forum/viewtopic.php?f=9&t=6902
> >
> >
> > ----------------------------------------------------------
> > Jayme Proni Filho
> > Skype: jaymeproni
> > Twitter: @jaymeproni
> > Phone: +55 - 17 - 3631 - 6576
> > Mobile: +55 - 17 - 9605 - 3560
> > e-Mail: jaymeproni at yahoo dot com dot br
> > Blogs (Em construção)
> > Programandor: http://jaymeproni.wordpress.com
> > Sociedade em Ação: http://sociedaemacao.wordpress.com
> > ----------------------------------------------------------
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>
--- Em python...@yahoogrupos.com.br, Artus Bolzanni <bolzanni@...> escreveu
Olá, Artus. Obrigado por responder a minha pergunta.
A competição que eu vou participar é a Olimpíada Paraibana de Informática (OPI), a qual aceita as linguagens C, C++, Java, Pascal e Python.
Eu participei desta competição no ano passado, no entanto, como ainda era iniciante em Python, resolvi fazer as questões em Pascal.
Eu me lembro que na olimpíada passada algumas equipes fizeram a prova utilizando Python, só que muitas destas não se saíram bem. Acho que apenas duas ficaram em uma boa colocação.
A maioria das equipes que fizeram em Python não obtiveram êxito exatamente pela questão do tempo.
Por isso que eu estou tentando estudar as coisinhas de "baixo-nível" em Python para poder otimizar meus programas.
Se alguém do fórum tiver alguma experiência deste tipo, sua ajuda será bem-vinda.
>
> Luiz Augusto,
>
> cara...dá uma olhada no regulamento. Algumas competições só permitem algumas
> linguagens e algumas outras não levam desempenho em conta. Muito dessa tua
> preocupação pode acabar sendo sem sentido (se performance for irrelevante ou
> caso Python não seja aceito).
>
> Se fores olhar pelo campeonato promovido pela SBC (
> http://maratona.ime.usp.br/regras11.html) não há Python como disponível e a
> performance não conta como fator.
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
2011/4/19 luizaugustomm <no_r...@yahoogrupos.com.br>:
>
> --- Em python...@yahoogrupos.com.br, Artus Bolzanni <bolzanni@...> escreveu
>
> Olá, Artus. Obrigado por responder a minha pergunta.
> A competição que eu vou participar é a Olimpíada Paraibana de Informática (OPI), a qual aceita as linguagens C, C++, Java, Pascal e Python.
> Eu participei desta competição no ano passado, no entanto, como ainda era iniciante em Python, resolvi fazer as questões em Pascal.
> Eu me lembro que na olimpíada passada algumas equipes fizeram a prova utilizando Python, só que muitas destas não se saíram bem. Acho que apenas duas ficaram em uma boa colocação.
> A maioria das equipes que fizeram em Python não obtiveram êxito exatamente pela questão do tempo.
> Por isso que eu estou tentando estudar as coisinhas de "baixo-nível" em Python para poder otimizar meus programas.
> Se alguém do fórum tiver alguma experiência deste tipo, sua ajuda será bem-vinda.
Verifique qual o interpretador Python disponível, pois se for possível
utilizar o PyPy, além de ser mais rápido do que CPython, podem haver
outras técnicas de otimização a ser utilizadas.
--
Paul Eipper
Em 18 de abril de 2011 17:20, Jayme Proni Filho <
listas.pr...@gmail.com> escreveu:
>
>
> Lá no site mesmo tem uma explicação sobre otimização em códigos python
>
> http://br.spoj.pl/forum/viewtopic.php?f=9&t=6902
>
> ----------------------------------------------------------
> Jayme Proni Filho
> Skype: jaymeproni
> Twitter: @jaymeproni
> Phone: +55 - 17 - 3631 - 6576
> Mobile: +55 - 17 - 9605 - 3560
> e-Mail: jaymeproni at yahoo dot com dot br
> Blogs (Em construção)
> Programandor: http://jaymeproni.wordpress.com
> Sociedade em Ação: http://sociedaemacao.wordpress.com
> ----------------------------------------------------------
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
[As partes desta mensagem que não continham texto foram removidas]
------------------------------------
Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
Links do Yahoo! Grupos
<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/python-brasil/
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@yahoogrupos.com.br
<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html
Luiz Augusto,
sendo bem pragmático eu iria de C. Adoro Python, porém C ainda (e acredito
que sempre será) é a linguagem "perfeita" para esse tipo de competição.
Acredito que essa discussão sobre otimização tem mais valor para outras
áreas de aplicação (por isso acho esse tópico muito interessante) que não
competição.
[As partes desta mensagem que não continham texto foram removidas]
--- Em python...@yahoogrupos.com.br, Paul Eipper <lkraider@...> escreveu
>
> 2011/4/19 luizaugustomm <no_r...@yahoogrupos.com.br>:
> >
> > --- Em python...@yahoogrupos.com.br, Artus Bolzanni <bolzanni@> escreveu
> >
> > Olá, Artus. Obrigado por responder a minha pergunta.
> > A competição que eu vou participar é a Olimpíada Paraibana de Informática (OPI), a qual aceita as linguagens C, C++, Java, Pascal e Python.
> > Eu participei desta competição no ano passado, no entanto, como ainda era iniciante em Python, resolvi fazer as questões em Pascal.
> > Eu me lembro que na olimpíada passada algumas equipes fizeram a prova utilizando Python, só que muitas destas não se saíram bem. Acho que apenas duas ficaram em uma boa colocação.
> > A maioria das equipes que fizeram em Python não obtiveram êxito exatamente pela questão do tempo.
> > Por isso que eu estou tentando estudar as coisinhas de "baixo-nível" em Python para poder otimizar meus programas.
> > Se alguém do fórum tiver alguma experiência deste tipo, sua ajuda será bem-vinda.
>
> Verifique qual o interpretador Python disponível, pois se for possível
> utilizar o PyPy, além de ser mais rápido do que CPython, podem haver
> outras técnicas de otimização a ser utilizadas.
>
> --
> Paul Eipper
>
Paul, eu já entrei em contato com o pessoal da organização. Mas, até o momento, ninguém se pronunciou a respeito. :(
2011/4/19 Paul Eipper <lkra...@gmail.com>:
> Verifique qual o interpretador Python disponível, pois se for possível
> utilizar o PyPy, além de ser mais rápido do que CPython, podem haver
> outras técnicas de otimização a ser utilizadas.
>
As técnicas de otimização para o pypy é uma só e bem engraçada, "faça
o código mais pythonico possivel q ele vai ser o mais rápido". Ou
seja, não use map ou filter, faça tudo com List Comprehensions. Só tem
2 detalhes que ainda não foi possivel otimizar:
- StringIO é mais rápido do que ''.join()
- Geradores ainda são um pouco lento (no trunk isso já foi consertado
eu acho), escrever código sem eles é o melhor.
--
Leonardo Santagada
Artus, eu concordo com você. A melhor linguagem de programação para participar de maratonas é C.
O problema é que não faz muito tempo que eu comecei a estudar C e a maratona já é daqui há 20 dias.
Acho que, para mim, não valeria a pena trocar uma linguagem que eu já estou habituado e conheço a maioria das "ferramentas" inclusas para tentar mudar de linguagem de última hora e não conseguir resolver os problemas.
Acho que vou tentar usar Python nesta olimpíada e na próxima usarei C, pois já estarei mais preparado.
Valeu.
--- Em python...@yahoogrupos.com.br, Artus Bolzanni <bolzanni@...> escreveu
>
> Luiz Augusto,
>
> sendo bem pragmático eu iria de C. Adoro Python, porém C ainda (e acredito
> que sempre será) é a linguagem "perfeita" para esse tipo de competição.
>
> Acredito que essa discussão sobre otimização tem mais valor para outras
> áreas de aplicação (por isso acho esse tópico muito interessante) que não
> competição.
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
Uma coisa que me desmotiva as vezes em usar C é que as vezes tenho de fazer
muit código para pouca coisa, Python, Ruby e as vezes até Java resumem um
pouco o trabalho.
*
**Paulo Patto.*
*web developer.*
[java][ruby on rails][python][c/c++][php][javascript][.net]
microblog: http://twitter.com/paulopatto/
personal weblog: http://paulopatto.wordpress.com/
mobile: +55 11 8217.3514
instante messenger(msn): paulo...@paulopatto.com
*soon my corporate website http://www.paulopatto.com*
----------------------------------------------------------
*[pt-br]"Aquele que recebe de mim uma idéia tem aumentada a sua instrução
sem que eu tenha diminuído a minha. Como aquele que acende sua vela na minha
recebe luz sem apagar a minha vela. Que as idéias passem livremente de uns
aos outros no planeta, para a instrução moral e mútua dos homens e a
melhoria de sua condição, parece ter sido algo peculiar e benevolentemente
desenhado pela natureza ao criá-las, como o fogo, expansível no espaço, sem
diminuir sua densidade em nenhum ponto."*
*
*
*[en-us]"He who receives an idea from me, receives instruction himself
without lessening mine; as he who lights his taper at mine, receives light
without darkening me. That ideas should freely spread from one to another
over the globe, for the moral and mutual instruction of man, and improvement
of his condition, seems to have been peculiarly and benevolently designed by
nature, when she made them, like fire, expansible voer all space, without
lessenig their density in any point."*
***Thomas Jefferson* .
----------------------------------------------------------
2011/4/19 luizaugustomm <no_r...@yahoogrupos.com.br>
>
>
> Artus, eu concordo com você. A melhor linguagem de programação para
> participar de maratonas é C.
> O problema é que não faz muito tempo que eu comecei a estudar C e a
> maratona já é daqui há 20 dias.
> Acho que, para mim, não valeria a pena trocar uma linguagem que eu já estou
> habituado e conheço a maioria das "ferramentas" inclusas para tentar mudar
> de linguagem de última hora e não conseguir resolver os problemas.
> Acho que vou tentar usar Python nesta olimpíada e na próxima usarei C, pois
> já estarei mais preparado.
> Valeu.
>
>
> --- Em python...@yahoogrupos.com.br, Artus Bolzanni <bolzanni@...>
> escreveu
> >
> > Luiz Augusto,
> >
> > sendo bem pragmático eu iria de C. Adoro Python, porém C ainda (e
> acredito
> > que sempre será) é a linguagem "perfeita" para esse tipo de competição.
> >
> > Acredito que essa discussão sobre otimização tem mais valor para outras
> > áreas de aplicação (por isso acho esse tópico muito interessante) que não
> > competição.
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>
>
>
[As partes desta mensagem que não continham texto foram removidas]
Se você quer desempenho mesmo. Faça em C. Acredito que falar de desempenho
em python agora, nesse tipo de aplicação, seria como antigas dicussões sobre
java ser lento e usar muita memória e blá blá blá.
E como os problemas são de competição, serve para você exercitar construção
de algoritmos. Na python, você vai deixar de fazer um merge sort por exemplo
para usar o método sort() ou sorted() dependendo do caso.
C é legal por isso, ela é burra. Você tem que construir toda a lógica. Ela
só cuida da compilação. Linguagem muito bacana para aprender a programar e
estudar HPC.
Mas essa é minha opinião.
----------------------------------------------------------
Jayme Proni Filho
Skype: jaymeproni
Twitter: @jaymeproni
Phone: +55 - 17 - 3631 - 6576
Mobile: +55 - 17 - 9605 - 3560
e-Mail: jaymeproni at yahoo dot com dot br
----------------------------------------------------------
[As partes desta mensagem que não continham texto foram removidas]
2011/4/19 Jayme Proni Filho <listas.pr...@gmail.com>:
> Se você quer desempenho mesmo. Faça em C. Acredito que falar de desempenho
> em python agora, nesse tipo de aplicação, seria como antigas dicussões sobre
> java ser lento e usar muita memória e blá blá blá.
> E como os problemas são de competição, serve para você exercitar construção
> de algoritmos. Na python, você vai deixar de fazer um merge sort por exemplo
> para usar o método sort() ou sorted() dependendo do caso.
Que usa o timsort que é melhor do que merge sort :)
> C é legal por isso, ela é burra. Você tem que construir toda a lógica. Ela
> só cuida da compilação. Linguagem muito bacana para aprender a programar e
> estudar HPC.
> Mas essa é minha opinião.
A minha opinião, de quem já participou de maratona é, faça em C++ ou
quem sabe em java. A STL e stdlib de java tem muita tralha pronta já
pra ti, e dá uma baita mão na roda. Eu prefiro c++ pq se o bixo pega
tu sempre pode fazer o algoritmo a mão e ter certeza do que esta
acontecendo. Outra coisa importante numa maratona é estar bem treinado
em um dos editores de texto disponiveis, de preferencia o emacs ou o
vim se tu estiver usando C++ ou eclipse se tu sabe java (acho que só
tem eclipse geralmente em maquinas de maratona). Também esquematize
como vai ser feito os testes, eu gosto de deixar um interpretador de
python aberto sempre para testar algumas ideias, mesmo programando em
C++.
Ah, e treine bastante :)
Boa sorte ai.
--
Leonardo Santagada