Python ou pas Python

Je vais parler des problèmes que j'ai rencontrés lors du choix de Python3 comme première langue.
Je n'ai pas étudié la programmation à l'université.
Je ne veux pas commencer Holywar.

En 2016, Google a conseillé d'apprendre Python3 si nécessaire:

1. Langue facile à démarrer.
2. Langage pour l'apprentissage automatique.
3. Langue pour les jeux 2d simples.

1. J'ai regardé la première conférence du cours Harvard CS50 sur le site Web JavaRush et j'ai réalisé que je ne voulais pas:

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

Quand vous pouvez le faire:

 print('Monty Python') 

JavaScript a effrayé une combinaison de trois systèmes: JS / HTML / CSS.

2. L'apprentissage automatique a inspiré tous les articles et exemples pour ressembler au cyberpunk et à la science-fiction.

3. Puis-je programmer les jeux? Super!

J'ai importé cela, j'ai apprécié la philosophie de Python et j'ai commencé à lire le livre de Michael Dawson, Programming Python. Trois semaines après «Hello World!», J'ai écrit un clone du jeu Life avec une interface graphique. Je suis tombé amoureux de Python et quand les difficultés ont commencé, j'ai pensé que je n'en savais pas assez et que j'écrivais de mauvais algorithmes.

La vitesse

J'ai utilisé tkinter et dessiné des rectangles pour créer des cellules.
Champ 800x640. La taille des cellules est 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 si petit champ n'a pas eu le temps de se remplir complètement. Environ 600 cellules ont été mises à jour rapidement, mais dès que j'ai réduit la taille des cellules à 4, le taux de changement de l'état des cellules et la réponse de l'interface ont chuté.

J'ai supprimé la classe Square et commencé à dessiner des pixels de l'image. L'interface a bien fonctionné, mais après 200 cellules, tout a été mis à jour très lentement. J'ai trouvé un problème dans l'algorithme. Dessinez une cellule de 4 pixels plus lente 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)) 

Après corrections, j'ai obtenu 600 cellules à vitesse normale et de très petits chiffres à l'écran. J'ai réussi à porter la vitesse à 900 cellules lorsque j'ai arrêté de vérifier l'image pour le «pixel noir» et j'ai commencé à stocker l'état du système dans la matrice.

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

J'ai installé pygame, migré l'algorithme et obtenu 9000 cellules à 4 fps. Mais les jeux tournent plus vite et il n'y a pas que des points à l'écran.
J'ai commencé à soupçonner que c'était une question de langue.
J'ai essayé Cython. Un système de 30 000 cellules gagnées à 4 fps.



Je ne voulais pas de C, mais j'ai eu C.

Comment emballer pour la portabilité vers un autre ordinateur?

J'ai traité cela en utilisant py2app, mais je ne comprenais toujours pas comment cela fonctionne.

Bibliothèque standard et modules tiers

Je n'ai pas réussi à évaluer cela. J'ai constamment installé autre chose et, parfois, les modules ne voulaient pas fonctionner les uns avec les autres. J'ai eu trois venvs pour un emballage d'application séparé avec tkinter, tkinter + oreiller et pygame. J'ai regardé dans le dossier site-packages et je ne savais pas de quoi cela dépend et pourquoi il se trouve là. Je n'ai pas écrit mes modules. J'étais prêt.

En général, je suis passé par là et je voulais la simplicité.
Une langue qui se voit.

J'ai choisi Lua. Pour une raison quelconque, j'ai choisi une autre langue avec une syntaxe pas tout à fait familière :-)

La vitesse

J'ai fait Life sur Lua + Love2d. Je viens d'utiliser la langue et les fonctions du moteur.

 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 

Avec 111735 cellules vivantes, le système fonctionne à 18 images par seconde.



Comment emballer pour la portabilité vers un autre ordinateur?

J'ai écrit des scripts sur Lua + Love2d pour emballer des applications pour MacOS et Windows. Oui, il y a une instruction sur le site , mais maintenant pour moi ce processus n'est pas aussi "magique" qu'avec py2app.

Petite bibliothèque standard

J'ai raté les fonctions Python habituelles: cartographier, filtrer, réduire, plage et j'ai dû créer une bibliothèque fonctionnelle. Il n'y a pas de classes dans Lua, mais j'ai lu comment les ajouter au langage et j'ai mieux compris comment les classes fonctionnent en Python. Ce n'est qu'avec Lua que j'aimais les fermetures et les générateurs.

Lorsque j'ai essayé toutes les fonctions de la bibliothèque standard et un tiers des fonctions des modules pour interagir avec le langage C, j'ai eu une idée générale du langage. C'est une sensation très agréable. Lua semble être un bon point de départ, mais la langue n'est pas populaire.

Si je pouvais resélectionner la première langue, je commencerais par JavaScript.
Pourquoi?

1. La langue s'exécute dans les navigateurs.
2. Populaire.
3. Apprendre à connaître le Web.
4. JavaScript + pixi.js et le jeu Life fonctionneront sans problème.

Et Python, j'étudierais avec des algorithmes d'apprentissage automatique.

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


All Articles