Python ou não Python

Vou falar sobre os problemas que encontrei ao escolher o Python3 como o primeiro idioma.
Eu não estudei programação na universidade.
Eu não quero começar holywar.

Em 2016, o Google recomendou o aprendizado de Python3, se necessário:

1. Fácil de iniciar o idioma.
2. Idioma para aprendizado de máquina.
3. Idioma para jogos 2D simples.

1. Assisti à primeira palestra do curso Harvard CS50 no site JavaRush e percebi que não queria:

#include <stdio.h> int main(int argc, const char *argv[]) { printf("Hello world\n"); return 0; } 

Quando você pode fazer isso:

 print('Monty Python') 

JavaScript assustou uma combinação de três sistemas: JS / HTML / CSS.

2. O aprendizado de máquina inspirou todos os artigos e exemplos a se parecerem com cyberpunk e ficção científica.

3. Posso programar os jogos? Ótimo!

Importei isso, apreciei a filosofia do Python e comecei a ler o livro de Michael Dawson, Programming Python. Três semanas depois de “Hello World!”, Escrevi um clone do jogo Life com uma interface gráfica. Eu me apaixonei por Python e, quando as dificuldades começaram, pensei que não sabia o suficiente e escrevi algoritmos ruins.

Velocidade

Usei o tkinter e desenhei retângulos para criar células.
Campo 800x640. O tamanho da célula é 10x10.

 class Square(object): def __init__(self, canvas, x, y, size, main): self.canvas = canvas self.cel = self.canvas.create_rectangle(x, y, x + size, y + size, fill='#EEEEEE') self.main = main self.color_change = True self.canvas.tag_bind(self.cel, '<ButtonPress-1>', self.paint) 



Um campo tão pequeno não teve tempo para preencher completamente. Cerca de 600 células foram atualizadas rapidamente, mas assim que reduzi o tamanho da célula para 4, a taxa de alteração no estado das células e a resposta da interface caíram.

Eu removi a classe Square e comecei a desenhar pixels da imagem. A interface funcionou bem, mas após 200 células tudo foi atualizado muito lentamente. Encontrei um problema no algoritmo. Desenhe uma célula de 4 pixels mais lenta que 1 pixel.

 def fill_black(self, x, y, color): for i in range((-self.cell // 2) - 1, (self.cell // 2) - 1): for j in range((-self.cell // 2) - 1, (self.cell // 2) - 1): xx = (x + i) % self.can_width yy = (y + j) % self.can_height self.cell_matrix.put(color, (xx, yy)) 

Após as correções, obtive 600 células na velocidade normal e figuras muito pequenas na tela. Consegui elevar a velocidade para 900 células quando parei de verificar a imagem do “pixel preto” e comecei a armazenar o estado do sistema na matriz.

 def fill_black(self, coords, color, virt_color): x, y = coords self.virt_mat[x][y] = virt_color self.cell_matrix.put(color, (x, y)) 

Eu instalei o pygame, migrei o algoritmo e obtive 9000 células a 4 fps. Mas os jogos correm mais rápido, e não há apenas pontos na tela.
Comecei a suspeitar que era uma questão de linguagem.
Eu tentei o Cython. Um sistema de 30.000 células obtidas a 4 qps.



Eu não queria C, mas peguei C.

Como embalar para portabilidade para outro computador?

Eu lidei com isso usando py2app, mas ainda não entendi como funciona.

Biblioteca padrão e módulos de terceiros

Não consegui avaliar isso. Eu constantemente instalava outra coisa e, às vezes, os módulos não queriam trabalhar um com o outro. Eu tinha três venvs para embalagens de aplicativos separados com tkinter, tkinter + travesseiro e pygame. Procurei na pasta pacotes de sites e não sabia do que depende e por que está lá. Eu não escrevi meus módulos. Eu estava parecendo pronto.

Em geral, eu passei por isso e queria simplicidade.
Uma linguagem que pode ser vista.

Eu escolhi Lua. Por alguma razão, escolhi outro idioma com uma sintaxe não muito familiar :-)

Velocidade

Eu fiz Life on Lua + Love2d. Eu apenas usei as funções de linguagem e mecanismo.

 function Life:draw() love.graphics.setCanvas(self.canvas) love.graphics.clear() for y=1,self.rows do for x=1,self.cols do if self.cells[y][x]==1 then love.graphics.setColor(self.color) love.graphics.points(x-1,y-1) end end end love.graphics.setCanvas() love.graphics.setColor(set.WHITE) love.graphics.draw(self.canvas,self.x,self.y) end 

Com 111735 células vivas, o sistema opera a 18 fps.



Como embalar para portabilidade para outro computador?

Escrevi scripts no Lua + Love2d para empacotar aplicativos para MacOS e Windows. Sim, há uma instrução no site , mas agora para mim esse processo não é tão "mágico" quanto no py2app.

Pequena biblioteca padrão

Perdi as funções usuais do Python: mapear, filtrar, reduzir, variar e tive que criar uma biblioteca funcional. Não há classes em Lua, mas li como adicioná-las à linguagem e entendi melhor como as classes funcionam em Python. Somente com Lua eu gostei de fechamentos e geradores.

Quando tentei todas as funções da biblioteca padrão e um terço das funções dos módulos para interagir com a linguagem C, tive uma idéia geral da linguagem. Esta é uma sensação muito agradável. Lua parece ser um bom lugar para começar, mas o idioma não é popular.

Se eu pudesse selecionar novamente o primeiro idioma, começaria com JavaScript.
Porque

1. O idioma é executado nos navegadores.
2. Popular.
3. Conhecendo a web.
4. JavaScript + pixi.js e o jogo Life vão funcionar sem problemas.

E Python, eu estudaria junto com algoritmos de aprendizado de máquina.

Source: https://habr.com/ru/post/pt478928/


All Articles