Python o no Python

Hablaré sobre los problemas que encontré al elegir Python3 como primer idioma.
No estudié programación en la universidad.
No quiero comenzar la guerra santa.

En 2016, Google aconsejó aprender Python3 si es necesario:

1. Fácil de comenzar el lenguaje.
2. Lenguaje para el aprendizaje automático.
3. Lenguaje para juegos 2D simples.

1. Vi la primera conferencia del curso Harvard CS50 en el sitio web JavaRush y me di cuenta de que no quería:

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

Cuando puedes hacer esto:

 print('Monty Python') 

JavaScript asustó una combinación de tres sistemas: JS / HTML / CSS.

2. El aprendizaje automático inspiró todos los artículos y ejemplos para parecerse al ciberpunk y la ciencia ficción.

3. ¿Puedo programar los juegos? Genial

Importé esto, aprecié la filosofía de Python y comencé a leer el libro de Michael Dawson, Programming Python. Tres semanas después de "Hello World!" Escribí un clon del juego de Life con una interfaz GUI . Me enamoré de Python y cuando comenzaron las dificultades, pensé que no sabía lo suficiente y escribía algoritmos malos.

Velocidad

Usé tkinter y dibujé rectángulos para crear celdas.
Campo 800x640. El tamaño de la celda es de 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) 



Un campo tan pequeño no tuvo tiempo de llenarse por completo. Alrededor de 600 celdas se actualizaron rápidamente, pero tan pronto como reduje el tamaño de la celda a 4, la tasa de cambio en el estado de las celdas y la respuesta de la interfaz disminuyeron.

Eliminé la clase Square y comencé a dibujar píxeles de la imagen. La interfaz funcionó bien, pero después de 200 celdas, todo se actualizó muy lentamente. Encontré un problema en el algoritmo. Dibuje una celda de 4 píxeles más lenta que 1 píxel.

 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)) 

Después de las correcciones, obtuve 600 celdas a velocidad normal y cifras muy pequeñas en la pantalla. Logré llevar la velocidad a 900 celdas cuando dejé de verificar la imagen para el "píxel negro" y comencé a almacenar el estado del sistema en la 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)) 

Instalé pygame, migré el algoritmo y obtuve 9000 celdas a 4 fps. Pero los juegos se ejecutan más rápido y no solo hay puntos en la pantalla.
Comencé a sospechar que era una cuestión de lenguaje.
Intenté con Cython. Un sistema de 30,000 células ganadas a 4 fps.



No quería C, pero obtuve C.

¿Cómo empacar para la portabilidad a otra computadora?

Me ocupé de esto usando py2app, pero aún no entendía cómo funciona.

Biblioteca estándar y módulos de terceros.

No logré evaluar esto. Constantemente instalaba algo más y, a veces, los módulos no querían funcionar entre sí. Tuve tres venvs para empaques de aplicaciones separadas con tkinter, tkinter + pillow y pygame. Miré en la carpeta de paquetes del sitio y no sabía de qué depende y por qué está allí. No escribí mis módulos. Estaba buscando listo.

En general, pasé por esto y quería simplicidad.
Un lenguaje que se puede ver.

Elegí a Lua. Por alguna razón, elegí otro idioma con una sintaxis no muy familiar :-)

Velocidad

Hice Life on Lua + Love2d. Acabo de usar el lenguaje y las funciones del motor.

 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 

Con 111735 células vivas, el sistema funciona a 18 fps.



¿Cómo empacar para la portabilidad a otra computadora?

Escribí scripts en Lua + Love2d para empaquetar aplicaciones para MacOS y Windows. Sí, hay una instrucción en el sitio , pero ahora para mí este proceso no es tan "mágico" como con py2app.

Pequeña biblioteca estándar

Eché de menos las funciones habituales de Python: mapa, filtro, reducción, rango y tuve que hacer una biblioteca funcional. No hay clases en Lua, pero leí cómo agregarlas al lenguaje y entendí mejor cómo funcionan las clases en Python. Solo con Lua me gustaron los cierres y los generadores.

Cuando probé todas las funciones de la biblioteca estándar y un tercio de las funciones de los módulos para interactuar con el lenguaje C, tuve una idea general del lenguaje. Este es un sentimiento muy agradable. Lua parece ser un buen lugar para comenzar, pero el idioma no es popular.

Si pudiera volver a seleccionar el primer idioma, comenzaría con JavaScript.
Por qué

1. El lenguaje se ejecuta en los navegadores.
2. Popular.
3. Conocer la web.
4. JavaScript + pixi.js y el juego Life funcionarán sin problemas.

Y Python, estudiaría junto con algoritmos de aprendizaje automático.

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


All Articles