Eu estudei um pouco de algoritmos e procurei em sites como SPOJ.pl TopCoder etc. Vi que os programadores preferem C ou C ++ geralmente para a maioria dos concursos de programação algorítmica.
Agora eu tenho tido alguns problemas ultimamente. Eu conheço um pouco de C e Python e, ao tentar escrever um código, pareço preferir Python ao C para a maioria dos algoritmos. Toda vez que me sento para escrever um código no IC, desisto depois de 15 minutos, porque o considero muito complicado e tendem a passar para o python. Passando matrizes Ponteiros e assim por diante parecem ser um desperdício de tempo inútil que eu poderia estar utilizando para pensar no próprio algoritmo.
Agora eu sei e ouvi de muitas pessoas que C é uma linguagem muito importante e é o pão com manteiga de muitos programadores por aí.
O que eu queria saber era se essa minha abordagem tem algumas desvantagens / consequências / desvantagens, etc.
Este não é um debate Python vs C; Esta é uma pergunta sobre como essa prática específica de preferir python sobre C por causa da facilidade de uso afetará a mim ou a qualquer outro programador / cientista de computador a longo prazo.
Eu adoraria ouvir pessoas que usaram esses idiomas no setor / e / ou desenvolver grandes softwares / bibliotecas etc.
fonte
Respostas:
Na minha experiência, quando as pessoas têm excesso de dificuldade em codificar algoritmos em C, geralmente é porque estão acoplando fortemente o gerenciamento da estrutura de dados ao algoritmo, em vez de criar abstrações apropriadas. Por exemplo, manipular manualmente ponteiros de lista vinculada em qualquer lugar, em vez de criar
push()
epop()
funções. Eles estão muito acostumados a receber essas abstrações.Embora esse problema seja muito mais evidente com abstrações de nível inferior, a falha em reconhecer um acoplamento rígido e criar abstrações apropriadas é um problema em qualquer nível. A prática dessas habilidades em C até que você possa criar um algoritmo que pareça limpo e legível será transferida para qualquer idioma usado.
O outro problema que ocasionalmente vejo entre os programadores python é a dificuldade de adaptação ao desempenho em escala. É verdade que o desempenho geralmente não é a principal preocupação, mas a maneira mais pitônica de implementar um algoritmo para uma estrutura de dados relativamente pequena pode paralisar o sistema quando você trabalha com gigabytes ou mais de dados. Tornar-se um bom programador de C ajuda você a ter mais consciência desses tipos de problemas em qualquer idioma.
Você pode aprender essas habilidades em outros idiomas? Claro, mas C ajuda, tornando-o muito mais óbvio quando você erra.
Dito isto, eu uso o python para programação algorítmica quando tenho uma escolha, mesmo que eu esteja confortável com o C. O Python possui recursos de linguagem que o tornam muito agradável para esse tipo de programação, e as diferenças de desempenho geralmente são desprezíveis. Não sei explicar por que outros programadores que conhecem os dois escolheriam C. Imagino que muitos o façam para se destacar da multidão.
fonte
Pesquisadores cujo interesse principal não é programar preferem linguagens de nível superior, como o Python, porque podem codificar uma solução mais rapidamente nessas linguagens do que, digamos, C. O Python é particularmente adequado para isso porque é mais orientado à "prototipagem". "baterias incluídas" e integra-se a bibliotecas numéricas como NumPy e SciPy.
Se um pesquisador precisar de melhor desempenho, ele normalmente entregará o algoritmo que criou no Python a um engenheiro de software, que encontrará maneiras de otimizá-lo (até e incluindo a recodificação em C).
fonte
Lembre-se do SPOJ.pl, a competição ACM e todas as competições similares estão focadas na produção rápida de código de trabalho que será descartado logo após a competição. O TopCoder faz isso, mas em menor extensão (o código existe pelo menos adequadamente organizado no nível de design do OO).
No entanto, no mundo real da programação quase todos os atalhos que você usaria em competições de programação algorítmica é um antipadrão. Somente se você tiver isso em mente, poderá fazer algum tipo de comparação. Vamos dar o seu exemplo: passando uma matriz multidimensional entre diferentes funções. Em um ambiente de competição, a melhor abordagem seria simplesmente declarar a matriz global para economizar tempo, calculando os detalhes adequados da chamada (por exemplo, devo passar o tamanho ou pode ser determinado?). Na programação da vida real, eu faria exatamente o oposto.
Portanto, para sua pergunta, existem consequências complexas da escolha de Python sobre C para algoritmos, eu diria que não. Se você estiver interessado apenas no algoritmo, fará o mesmo em Python e C. A implementação em uma linguagem funcional pode apresentar algumas diferenças, mas o algoritmo ainda é o mesmo.
Virtualmente, a única coisa que você ganhou ao implementar o algoritmo em C é mais controle sobre a execução e uma garantia de que você está usando apenas abstrações de nível inferior. Isso não é uma coisa pequena, já que em Python grande parte da complexidade está oculta. Mas se o problema não for trivial nas abstrações de nível superior, você provavelmente só perdeu a velocidade de execução e, na maioria dos casos, não está realmente tentando tornar o programa o mais rápido possível, está simplesmente aprendendo .
Como já sugerido, você sempre pode trocar uma implementação Python por C, se o Python estiver muito lento. Mas isso provavelmente acontecerá 2-3 vezes em um grande projeto; portanto, iniciar em C pode ser uma perda de tempo, a menos que seja o seu idioma preferido (e você tenha indicado que não).
fonte
Como um membro de longa data do TopCoder e um usuário ocasional do SPOJ, posso dizer que uma das principais razões para preferir o C / C ++ em relação a outros idiomas nas competições é a velocidade bruta. Quando a execução do seu programa é cronometrada, há uma enorme pressão para escolher a linguagem "mais rápida" que você pode obter, pois oferece mais folga em termos de codificação do seu algoritmo. Minha progressão no TC foi de Java para C # para C ++.
No entanto, essa situação é mais comum em competições do que no desenvolvimento do dia-a-dia: embora escrever código ideal seja universalmente importante, a importância relativa de terminar seu código o mais rápido possível e torná-lo o mais sustentável possível geralmente supera a economia de alguns cem ciclos de CPU. Se você se sente mais à vontade em codificar algo em Python, muitas vezes é uma solução preferida.
Além disso, o Python oferece recursos de alto nível que não estão disponíveis em C ++. Construí-los é geralmente muito caro e, às vezes, até impossível (por exemplo, considere a criação de reflexão ou código auto-modificável em C ++). Em casos como esse, contar com uma linguagem de nível superior também pode ser uma solução ótima.
fonte
Esse ganho de produtividade é o motivo comum pelo qual os trabalhos em C e C ++ diminuíram substancialmente.
Existem duas partes principais nisso. O primeiro é a programação algortihmic. Realmente não importa qual idioma você usa para expressar o algoritmo. Trabalhar com o próprio algoritmo e ajustar os problemas corretos nos problemas certos é a parte principal, portanto não há problema real.
A segunda parte são ganhos de produtividade. Usar coisas que o tornam mais produtivo ao longo do tempo é um bom hábito e algo que não fará nada além de beneficiar você durante sua carreira. Ser capaz de expressar os algoritmos em diferentes idiomas é muito útil, mas essa utilidade é mais sobre os idiomas que os idiomas usam, não necessariamente o que são esses idiomas.
Em suma, não se preocupe . O que você usa para expressar o algoritmo é muito menos importante do que ser capaz de expressá-lo.
fonte
As vantagens de usar linguagens de alto nível como Python ou Ruby são que (1) sua sintaxe está muito próxima do pseudocódigo e (2) suas bibliotecas padrão fornecem estruturas de dados úteis prontas para uso (as baterias incluíam o conceito que o @Robert mencionou). Portanto, é perfeitamente bom preferir usá-los. Use o que maximiza sua produtividade, em vez de escolher um idioma apenas por ser mainstream ou "legal".
fonte
O que você estará perdendo ao programar em linguagens de nível "superior" que o C / C ++ é aprender como os computadores funcionam. Você não poderá desenvolver coisas como sistemas embarcados, sistemas operacionais e drivers de hardware. Conhecer C também ajuda ao aprender montador.
Além disso, a grande maioria de todos os sistemas de missão crítica ainda é desenvolvida em C; portanto, talvez você não consiga trabalhar em vários ramos de software (aeroespacial / automotivo / técnico em tecnologia, etc.) sem saber.
fonte
Se alguma vez houver uma pergunta sobre 'Big O notation' e você tentar medir isso, pode ser mais difícil fazer em Python, a menos que você saiba muito mais sobre como o python implementa as coisas, por exemplo, uma lista Python não é uma lista vinculada ; A classificação de Pythons é TimSort; O lixo do Python é coletado em determinados momentos ...
Eu sempre acho mais fácil conectar um programa C ao que provavelmente está acontecendo em um processador, mas mesmo aqui, há cache do processador; redução de tempo do sistema operacional; Otimizações do compilador, etc., que podem afetar minha intuição.
Acho mais rápido escrever e depurar código Python, para que, quando for possível, eu escreveria primeiro no Python, concentrando-se em obter algo que funcionasse. Com este programa Python em funcionamento, você pode colocá-lo em um sistema maior e descobrir não apenas que funcionou, mas também se foi rápido o suficiente ou em que aspecto foi lento. A obtenção de alguns dados reais de desempenho ajuda quando você otimiza a velocidade e permite testar a versão do Python contra qualquer reescrita posterior no Python ou C ou qualquer outra coisa.
Portanto, os inconvenientes de usar apenas o Python é que pode ser difícil colher os benefícios dos algoritmos escritos, esperando alguma compilação do tipo C no modelo de processador. As desvantagens de usar apenas C são as que você declarou: É um porco escrever e depurar e você acaba tendo que escrever suas próprias bibliotecas com muita frequência.
Eu acho que seria melhor usar os dois (e outros idiomas), até você ter uma idéia de suas vantagens e desvantagens. Eu próprio era um bom codificador C, mas agora escrevo muito pouco código C original, embora ainda precise ler (e às vezes depurar) código C em meu trabalho. Embora eu prefira Python, eu conheço e ainda uso Perl e Awk (e sed e grep e sort e Tcl e C e ...).
fonte
Aconselho você a olhar para Scala ou Clojure (mas use anotações de tipo). Em alguns casos, eles podem ser tão rápidos quanto C; em outros, ainda são muito mais rápidos que o Ruby / Python, embora tenham muito consice e notação clara, ao contrário de C ( IMHO ). Considere este código C vs:
Também eles têm função arsenal de programação semelhante ao Ruby / Python
map
,filter
,reduce
etc, que não é tão rápido quanto a iteração ou chamada de cauda recursão, no entanto, ainda é muito mais rápido, em seguida, as linguagens de script totalmente dinâmico.fonte
Eu trabalhei em uma pequena parte de uma grande biblioteca C ++ por alguns anos e escrevi minha tese de bacharelado e mestrado no contexto desta biblioteca. A biblioteca, aliás, é uma biblioteca para algoritmos de bioinformática e estruturas de dados.
A biblioteca é criada em C ++ porque o C ++ é quase perfeito para os requisitos específicos dessa biblioteca e para bibliotecas de algoritmos em geral. Se eu desenvolvesse outra biblioteca de algoritmos e a escolha da linguagem fosse minha, certamente escolheria C ++ novamente.
O motivo não é apenas o desempenho, mas também o sistema de tipos robusto que, em primeiro lugar, oferece mais segurança e, em segundo lugar, permite que seus tipos documentem o algoritmo usado. Isso pode (na minha experiência) melhorar muito a legibilidade e a manutenção.
Dito isto, para rabiscos e quebra-cabeças algorítmicos simples, quase sempre uso o Python (principalmente porque sim, ele se parece quase com pseudo-código), a menos que eu queira especificamente tentar a melhor forma de formular um problema em C ++. Até agora, eu não resolvi muitos dos problemas do SPOJ ou do TopCoder, então não sei se o desempenho é realmente tão crítico que o uso de uma linguagem rápida é crucial.
Mas normalmente o que conta é acertar o algoritmo para passar. Nesses casos, o Python funciona bem. Por exemplo, para os problemas do Project Euler (que não são cronometrados, apenas a solução correta conta), o Python é perfeitamente adequado.
fonte