Executando verificação de segurança...
2

[DÚVIDA ] Porquê Python se C/C++ é bem melhor??

Contexto Inicial:
Em um teste para uma empresa, foi me pedido para tratar uns dados, subir num banco de dados e retorna uma analise dos dados. Até aqui tudo certo, fiz usando Python e pandas(Apesar de saber, não sou dev e não gosto muito do python).

O problema que o Python ao ler o CSV(gigante!) me retornava uma falha de segmentação. quando lia por volta de 2000 a 3000 linhas do arquivo, o script parava e retornava a falha, o kernel(linux) salva a falha no log e vida que segue.

Nada dava certo. Então separei o problema em 2 partes, ou scripts. O primeiro era escrito em C, lia o arquivo CSV, armazenava 5000 linhas em outro aquivo .txt e o segundo script, em Python, lia o novo arquivo gerado, formatava os dados e enviava para o mongo atlas.

Ao escrever o script C, a memoria era liberada e por isso o arquivo podia ser lido sem travar. Ou seja, Ponteiros Wins!

A Questão:
Aprendendo TensorFlow recebi o mesmo problema, falha de segmentação!(frustrante). E me veio a mente, porquê escrever o Tensorflow para uso com o python e não para uso direto com C/C++?(embora possa ser usado com C++, não é a mesma coisa)

Porquê não desenvolver uma biblioteca para uso direto em linguagens de médio nivel como C e C++?? Não seria mais lógico desenvolver redes neurais(que faz uso de muito calculo com matrizes, grafos, etc) em linguagens com mais controle, e consequentemente melhor otimização do trabalho?


PS1 - Entendo que Python torna o trabalho com redes neurais mais acessivel para não programadores e pesquisadores de outras areas.

PS2 - Ao usar Torch com Lua pude desenvolver pequenas redes sem problemas. o mesmo com PyThorch. O Erro de segmentação só ocorre com o python e apenas quando uso programas mais 'pesados' como o tensorflow ou o pandas(pandas é pesado?? haha). Isso tira a possibilidade de falha na memoria fixa.

PS3 - Pelo pouco que vi, erro de segmentação é uma especie de overflow porém mais vago. Pode ser um erro da gestão de memoria do proprio python, do kernel, da memoria fisica(defeito), de qualquer lugar. Uso o arch linux, tenho 7 anos de experiencia com ambientes linux mas não entendo nem nunca precisei ler os logs do sistema/kernel, e como não sou dev python, acho um trabalho desnecessario pesquisar/solucionar isso. Esse erro também acontece no meu segundo notebook, rodando Manjaro.

PS4 - A empresa para qual fiz o script disse que eu podia fazer o desafio como quisesse, usando a linguagem de minha escolha: ao entregar o script eles nunca nem retornaram a mensagem kkkkkk a vida do 'junior'(buscando minha primeira oportunidade) é uma humilhação...

Carregando publicação patrocinada...
4

Primeiro, precisa avaliar o que está acontecendo. Pelo que está dizendo o volume de dados é pequeno demais para Python não estar aguentando. Mesmo que Python aguente menos que C, ainda aguenta uma quantidade monumental. Eu não iria por esse caminho de culpar Python. Certamente tem outra explicação, mas não temos como saber só com o que foi coloado.

Em geral as bibliotecas que as pessoas usam com Python são escritas e C ou C++, e Python só é usada para passar os dados e interagir, inclusive o grosso do que é importante do Tensorflow é feito em C++. Então não acho que faça sentido reclamar disso.

Inclusive TF está disponível para várias linguagens, seja oficialmente ou através de comunidade. São só bindings para o C++.

Pode ter algum bug aí, mas não parece ser culpa de Python. Pode ter alguma configuração errada. E tem uma chance bem razoável de ser no C++.

Melhor é algo subjetivo por natureza. Eu não acho que a maioria das pessoas deveria usar diretamente Cou C++ para acessar os algoritmos que deseja.


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

1

Boa noite amigo, acho que me expressei mal, eu culpei sim o Python, mas o MEU PYTHON, o que está rodando na minha maquina, que por algum motivo me retorna o erro, não quis generalizar e falar que Python é ruim, inclusive foi meu primeiro contato com programação, isso em 2011! kkkkk

Mas muito obrigado por sua contribuição! :)

2

Esse é um problema de implementação do código, não de linguagem. Segmentation fault é tentar acessar ou modificar uma área da memória RAM de uma forma que não é permitida, como tentar usar um espaço de memória reservada para outro programa ou tentar escrever em uma área que é somente para leitura, não tem relação com a forma como a linguagem foi construída.

O script em C rodou sem erros, simplesmente por não ter o mesmo erro que o seu script para Python, mas ele é muito mais sucetível de ter segmentation faults, pois você está manualmente pegando e liberando memória do computador.

A versão padrão do Python usa partes em C para as tarefas que requerem mais desempenho e o interpretador do Python roda em C, tanto que é chamado de CPython, então não faz sentido fazer essa comparação entre C e Python, como se fossem coisas completamente diferentes, quando na verdade têm muito em comum.

Eu suspeito que o problema esteja relacionado ao fato de que você não está usando generators e está lendo todo conteúdo do arquivo -> guardando tudo na memória -> só então o conteúdo guardado na memória é processado. Com um generator: lê uma linha do arquivo -> armazena a linha na memória -> dado armazenado é processado -> memória é liberada. Então é possível ler uma quantidade infinita de dados sem estar limitado pela quantidade de memória disponível.

1

Bom, com certeza meu script tem os erros que você mencionou. Como eu disse no texto eu não sou um dev python, embora meu primeiro contato com programação foi usando o python. Para tarefas como essa, de ler um arquivo, ou criar um site com Django, eu consigo, mas não sou um dev que domine de fato a linguagem e seus nuances.

O script em questão foi para mostrar de onde surgiu o erro e porquê cheguei no questionamento do texto, mas acho que me expressei mal e deu a entender que coloquei a culpa no python.

O erro de segmentação está ocorrendo antes mesmo de eu usar de fato o TensorFlow, um simples import e um calculo tá travando e retornando o erro. Ou seja, no Hello Word ja para tudo. Isso tem me impedido de estudar a ferramenta :( Esse erro também so aparece usando python, outras linguagens como C, C++ e Java nunca retornaram esse tipo de erro nos meus estudos. Foi por isso que pensei que fosse um bug da linguagem/sistema, erro de configuração do pacman ao instalar, algo desse tipo.

Mas obrigado por sua contribuição :)

2

Sem ver o código e uma amostra dos dados, é praticamente impossível determinar a causa exata. O que dá pra afirmar com relativa certeza é que culpar a linguagem costuma ser uma das piores formas de resolver. Na grande maioria das vezes a culpa não é da linguagem, e sim daquela pecinha entre a cadeira e o teclado :-)


Enfim, a ideia de ter uma biblioteca em Python, que delega o serviço pesado para C ou C++ é tentar ter o "melhor" dos dois mundos: ganha-se a conveniência de uma delas (por exemplo, a sintaxe mais amigável - na minha opinião - de Python, além da facilidade de integrar com outras bibliotecas da linguagem), e a velocidade de outra (o Python serve como uma "casca" que por debaixo dos panos chama o código mais rápido/otimizado feito em outra linguagem mais adequada para tal tarefa).

Poderia fazer tudo em C? Sim, assim como poderia fazer tudo em Assembly - afinal, pra que escrever em C, e depois compilar pra só então ter o executável? Fazer um compilador é muito complicado, escreve o código de máquina direto.

Acho que o ponto aqui é conveniência. Linguagens diferentes podem dar níveis de abstração e facilidades que vc não teria com outras. Fazendo esta "casca" com Python, de quebra vc ganha a facilidade de integrar seu programa com todo o resto da linguagem (todas as outras libs existentes). Dependendo do que precisa, isso pode fazer diferença e ser melhor do que usar a mesma lib diretamente em C.

1

Poderia fazer tudo em C? Sim, assim como poderia fazer tudo em Assembly - afinal, pra que escrever em C, e depois compilar pra só então ter o executável? Fazer um compilador é muito complicado, escreve o código de máquina direto.

Assembly não tem while/for, e eu ainda estou aprendendo a usar as intruções basicas EAX, EBX, ECX, EDX e as instruções MOV, CMP, JMP Etc. Quanto ao codigo de maquina, ficar escrevendo hexadecimal ou binario é mais tedioso que o Assembly então a menos que esteja trabalhando para os EUA em 1950, fica fora de questão. Nenhum programador em sã consciencia faria isso, eu acho kkkkkkk

Depois da brincadeira, falando sério agora:

"culpar a linguagem costuma ser uma das piores formas de resolver."

Eu culpei o MEU PYTHON, não o Python como linguagem/ferramenta usado por todos, acreditei que isso pudesse ser um problema no meu notebook, algo de errado com o python porquê o erro ocorre ao simplesmente chamar o TensorFlow. Eu não chego nem mesmo a escrever nada complexo, um simples import já serve pra travar e retornar o erro :(

Eu concordo com você, entendo que o uso do Python é facilitar. Mas minha questão era a falta de disponibilidade da biblioteca para uso direto com outras linguagens como o proprio C++. Eu tinha entendido, pelo que vi, que usar o TF em outras linguagens parte do basico de ter o TF instalado, e sempre vejo via pip, o que me faz pensar que Python é parte fundamental do TF, e realmente é. Nisso, fico impossibilitado de estudar, pois se no python que é mais facil, não consigo usar, como uso com C++, entende? Foi isso que gerou minha duvida.

Usei o script para mostrar de onde surgiu o problema, o código do script não é importante e com certeza tinha erros, mas esse erro em questão só aparece quando uso Python, por isso achei que o problema estava de fato no Python ou algo assim.

Bom, agradeço sua contribuição amigo :)

1

isso acontece pois python é mais simples para pessoas que não são desenvolvedoras, fazendo com que essas possam fazer coisas relacionadas a dados muito mais facilmente, fazendo com que a visibilidade da linguagem fique muito maior, porém C realmente é uma linguagem muito mais rápida, além de outros pontos que devem ser considerados, como o python ter muito mais bibliotecas para área de dados, a facilidade de aprendizado e tals

1

Acho que ocorreu algum erro na hora de programar ai, o csv é bem pequeno pra ter dado algum problema de memória. Teria o script disponibilizado para darmos uma olhada?
Segundo ponto, python é usado pela facilidade, tu não vai abrir um jupyter com kernel de C e sair fazendo transformações, groupbys, joins, etc... Por que é simplesmente trabalhoso, para EDA é simplesmente muito bom e quando o volume aumenta o pessoal costuma usar spark.