Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Quel choix pour coder et déployer son programme Qt : en C++ ou Python
Avec génération d'un exécutable ou distribution des sources ?

Le , par Jiyuu

15PARTAGES

2  0 
Quel langage et manière de déployer choisiriez-vous pour produire le code le plus optimisé possible
Bonjour,

Après plusieurs mois sans programmation je reviens parmi vous avec notamment le projet de reprendre l'un de mes programmes depuis le début.

L'idée est surtout d'améliorer le programme coté « programmeur » (coté utilisateur il sera aussi étoffé, mais ceci n'est pas le but de cette discussion), le but étant de d’obtenir un code :
• plus simple ;
• plus lisible ;
• plus facilement maintenable ;
• plus facilement mettable à jour.

Afin d’obtenir le meilleur compromis, je me pose alors les deux questions suivantes :
• pour la partie codage, mieux vaut-il faire un code en « pureQt » (en C++) ou utiliser l’un de ses binding (principalement en Python) ?
• pour le déploiement, faut-il favoriser la création d’un exécutable ou diffuser le code source et les bibliothèques nécessaires ?

Ces questions ne sont pas forcément très simples de réponse car supposent que les deux langages soient connus à niveau équivalent. Malgré tout une approche peut être faite pour dégrossir le sujet.

N’hésitez pas apporter en plus de vos votes un argumentaire en séparant bien les deux questions, même si elles peuvent être étroitement liées, il est peut-être plus simple de déployer d’une certaine manière avec un certain choix de langage…

Au niveau du code, il faut aussi remarquer que Qt Creator, l'EDI développé spécialement pour Qt, ajoute le support de Python dans sa dernière préversion.

Merci pour votre contribution.

J

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de tyrtamos
Expert éminent https://www.developpez.com
Le 25/06/2013 à 16:36
Bonjour,

Désolé de mon retard sur un sujet aussi intéressant, mais je suis en vacances dans un camping qui a un internet plutôt défaillant...

Même en connaissant C et C++ ainsi qu'une douzaine d'autres langages, je vote, bien sûr, pour Python avec juste quelques limites.

Python rend le codage vraiment très facile et très rapide. On peut faire beaucoup de POO, et utiliser une quantité invraissemblable de modules divers dans plein de domaines très différents. Et la mise en oeuvre de ces modules est très aisée.

En tant qu'outil de développement, j'utilise pour ma part Eclipse + Pydev, ce qui me donne une liaison directe avec tous mes projets, ce qui facilite la réutilisation de morceaux ainsi que la gestion de fonctions de bibliothèque perso. Pydev dispose de toutes les facilités d'édition (coloration syntaxique, completion y compris avec PyQt4, encodages, fins de ligne, debugging, etc...). Il est de plus multiplateforme, ce qui me permet de travailler de la même façon sur Windows, Linux et Mac OS X. Il a aussi le gros avantage de ne pas être écrit en Python, ce qui évite les inévitables conflits avec, en particulier, les threads et les processus...

Les projets en Python + PyQt4 sont très rapides, ou plutôt "aussi rapide qu'il est nécessaire". Si une réponse de 1/10 de seconde convient, utiliser un langage plus complexe pour passer à 1/100 seconde est complètement inutile: ce n'est plus un critère de choix. En fait, si Python est un langage interprété, les instructions Python passent la main très rapidement au code écrit en C/C++, ce qui fait que 80 ou 90% s'exécutent en fait au même rythme que le C/C++ compilé.

Certaines routines critiques en temps d'exécution peuvent s'écrire en Cython, ce qui accèlère beaucoup à condition de ne pas utiliser trop d'objets spécifiques Python (les appels multiples à l'API Python font perdre du temps). Par contre, avec des données de type C/C++, on peut utiliser directement les bibliothèques C/C++.

Pour la distribution du code: rien de plus facile. J'utilise beaucoup cx_freeze sous Windows et sous Linux, et ça marche très bien (avec quelques tatonnements tout de même). Cela permet de distribuer un "exe" accompagné de toutes les bibliothèques nécessaires, y compris, bien sûr, de l'interpréteur Python. Compte tenu de la puissance des machines actuelles, le volume que ça représente n'est vraiment pas un problème.

Sous Windows, après traitement par cx_freeze, on peut utiliser un installeur comme innosetup, et on obtient un fichier qui s'installe comme n'importe quel logiciel Windows: les utilisateurs ne sauront même pas que c'est du Python... Je n'ai pas essayé sous Linux, mais je sais qu'il est possible de fabriquer des paquets (.dev, .rpm) et de créer un dépot local personnalisé.

J'applique tout ça pour mes projets. Mon plus gros projet fait le traitement d'un concours internationnal de photos pour mon photo-club (en tant qu'amateur bénévole). Il est écrit en Python + PyQt4. Il contient plus de 20 fenêtres et plus de 25000 lignes de codes Python, avec:

- création d'étiquettes autocollantes avec codes barres
- lecture de codes barres avec pilotage du lecteur (sous Windows et Linux)
- formulaire de saisie avec des widgets personnalisés et de nombreuses vérifications. Les widgets personnalisés, écrits en Python, sont rendus utilisables par QtDesigner
- gestion complète d'une base de données relationnelle de 5000 articles, une quinzaine de tables avec contraintes de clés étrangères et mises à jour et destructions en cascade. J'utilise sqlite3 mais Postgresql ou Mysql sont possibles.
- consultation/modification dans la base de données avec des outils graphiques de PyQt4 (QTableView). On peut éditer des tables temporaires à partir de scripts sql écrits en interactif (QTextEdit). La recherche/filtrage peut s'effectuer avec les instructions sql, mais aussi par wildcard, expressions régulières et par mots similaires (avec ratio paramétrable). Le tri peut être fait avec l'ordre du dictionnaire français (script Python utilisé directement par sql)
- téléchargement ftp dans les 2 sens avec barre de progression et, si nécessaire, avec reprise
- compression/décompression zip
- une fenêtre éditeur de texte (QTextEdit)
- une fenêtre navigateur internet qui permet, entre autres, de lire les manuels d'utilisation écrits en html
- édition de résultats sous diverses formes: html, csv pour Excel, pdf, jpg, ... J'ai même un programme utilisant le module PyPdf pour regrouper plusieurs centaines de fichiers pdf en un seul pour faciliter l'impression.
- Traitement par cx_freeze pour obtenir un exe facilement transportable d'un pc à un autre, et qui s'exécute sans nécessiter d'installer Python et PyQt4.
- ...

Sincèrement, quand je vois avec quel facilité j'ai fait tout ça, je ne regrette pas d'avoir choisi Python. Et comme j'en suis le principal utilisateur, je peux confirmer que ça marche!

J'avais parlé tout au début de "quelques limites": les voici.

En tant que langage interprété, Python a quelques souplesses qui peuvent pousser à la faute. Trois exemples:
- une simple faute de frappe peut faire créer involontairement une nouvelle variable sans aucun message d'erreur puisqu'il n'y a pas de déclaration. Et l'importance de l'erreur ainsi commise ne sera visible qu'à l'exécution.
- certaines erreurs de codage n'apparaitront que lorsque la fonction concernée sera effectivement solicitée, c'est à dire le plus souvent après la distribution du logiciel.
- comme les variables, les arguments passés aux fonctions n'étant pas typés, on peut passer n'importe quoi, mais les conséquences se verront dans les traitements qui les utilisent: surprises possibles.

On peut aussi rencontrer des difficultés en cas d'exigence de temps de réponse, en particulier avec le ramasse miette qui peut se déclencher n'importe quand.

On peut, bien sûr, compenser en partie avec une (très très) solide méthode de développement,mais ce serait encore plus fiable si on ne pouvait pas faire autrement. Autrement dit, j'adore Python, mais si je devais coder pour Ariane ou pour le nucléaire, j'utiliserais un langage beaucoup plus contraignant... ADA?
5  0 
Avatar de dourouc05
Responsable Qt & Livres https://www.developpez.com
Le 21/06/2013 à 15:14
Citation Envoyé par arnolddumas Voir le message
les performances seront bien meilleurs en C++ qu'en Python
Il faut encore voir si l'augmentation de perfs est si phénoménale que ça… et aussi si ça a la moindre importance dans le cas précis. Je ne pense pas que l'aspect performances brutes doit être le premier critère pour le choix. (D'ailleurs, Python n'a généralement pas à rougir de ses performances, bien que ce n'est pas son but principal.)
3  0 
Avatar de arnolddumas
Rédacteur/Modérateur https://www.developpez.com
Le 20/06/2013 à 13:52
Citation Envoyé par Jiyuu Voir le message

Afin d’obtenir le meilleur compromis, je me pose alors les deux questions suivantes :
• pour la partie codage, mieux vaut-il faire un code en « pureQt » (en C++) ou utiliser l’un de ses binding (principalement en Python) ?
Je n'ai pas une grande expérience en Python donc mon avis sera forcément biaisé mais j'ai voté pour du code 100% C++. Je ne sais pas si l'application que tu développes est gourmande mais les performances seront bien meilleurs en C++ qu'en Python. Ca dépend aussi de ton expérience avec ces deux langages. Il y en a forcément un des deux que tu maitrises mieux que l'autre.

Citation Envoyé par Jiyuu Voir le message
• pour le déploiement, faut-il favoriser la création d’un exécutable ou diffuser le code source et les bibliothèques nécessaires ?
Je dirais que ça dépend des sytèmes d'exploitation visés. Pour Windows et Mac, il faut impérativement faire un installeur. Pour Linux, BSD et autres, le mieux est de mettre les sources sur Github ou équivalent. Après, un simple git clone suivi d'un cmake ou d'un qmake et le logiciel tourne sur la machine.

Si le logiciel est un minimum intéressant, il se retrouvera packagé dans la plupart des distributions. Tu peux aussi maintenir toi-même les paquets.
2  0 
Avatar de jbb2811
Membre régulier https://www.developpez.com
Le 21/06/2013 à 16:06
Le problème de performance est relatif.
Certes dans l'absolu le C++ est plus performant que le python, mais:
1) suivant ce que fait ton application ça se verra pas forcement ( à moins que tu fasse du traitement d'image/video ... ), et de toute façon python ou C++ la lib Qt et donc l'IHM restera en natif
2) comme c'est plus rapide/facile de coder en python qu'en C++, il te reste plus de temps pour optimiser
2  0 
Avatar de Apocalyps
Membre habitué https://www.developpez.com
Le 21/06/2013 à 14:37
Bonjour à tous, pour ce sondage, j'ai répondu :
Sans hésiter, un code 100 % en Qt ;
Tout simplement C++ (car Python n'est pas encore à mon ordre du jour ), l'interface de Qt Creator est amplement suffisante pour mes projets.

La création d'un exécutable sera plus propice à améliorer le "SAV" ;
ainsi que
La distribution des sources et des biblios sera d'une grande efficacité.
Ayant le projet de faciliter l'utilisation de mes logiciels pour les utilisateurs lambda, je me doit de créer un installeur Windows (minimum).
Les sources sont néanmoins disponible dans le cadre du logiciel libre et du portage Linux.
1  0 
Avatar de grim7reaper
Membre éclairé https://www.developpez.com
Le 21/06/2013 à 18:23
Citation Envoyé par olreak Voir le message
Utiliser python nécessiterait que tes utilisateurs installent un interpréteur python.
Pas nécessairement.
Il est possible de convertir un script en fichier .exe qui embarque son interpréteur et toutes les bibliothèques nécessaires avec lui.
cx_freeze est un outil qui permet ça (et qui a le bon goût d’être compatible Python 3)
1  0 
Avatar de grim7reaper
Membre éclairé https://www.developpez.com
Le 22/06/2013 à 6:54
Franchement, il n’y a pas vraiment matière à hésiter.

Si tu connais bien Python et que ton application est pas gourmande en calcul, bah go Python.
Le code sera plus court, plus lisible, plus maintenable, et plus portable (pas besoin de distribuer X exécutables).

Et puis même si c’est gourmand, il y a peu de chances que ça soit l’interface qui calcule. Donc au pire tu fais le cœur qui calcul avec un truc qui dépote (numpy, pypy, C++, …) et tu restes sur du Python pour l’interface.

[avis perso]
Moi je n’ai jamais vraiment aimé Qt à cause de l’étape intermédiaire avec le préprocesseur pour générer du code à partir des macros que tu dois foutre partout dans ton code. Je trouve ça moche au possible…
Cela dit, j’ai pas franchement d’alternative à proposer donc ça reste un ressenti personnel, pas spécialement une critique technique (ça ne réduit en rien la qualité de Qt).
Il y a aussi la propension que Qt a (avait ? Paraît que ça change un peu maintenant) à faire doublon avec la bibliothèque standard sur certains point (bon, ça c’est compréhensible vu qu’à l’époque des premières versions de Qt, la bibliothèque standard c’était pas aussi bien foutu que maintenant).

Par contre, quand j’ai testé Qt avec Python, là c’était beaucoup plus « joli », plus naturel (vu que Python de base offre déjà des mécanismes d’introspection) du coup j’ai pris plaisir à coder avec ce couple.
[/avis perso]
1  0 
Avatar de Enerian
Membre éclairé https://www.developpez.com
Le 22/06/2013 à 13:33
Il y a trois choses qui me dérangent avec PySide/PyQt :
  • Le style : les bindings ne respectent pas la pep8, et quand on utilise d'autres modules qui la respectent, on aboutit à un code hétérogène sur le plan du style.
  • Le support des IDE : je n'arrive pas à obtenir une auto complétion correcte sur ces bindings. J'utilise PyCharm, et impossible de générer les squelettes python. Ce serait cool que QtCreator propose un bon support de Python. J'ai hâte de voir ce que ça va donner sur la version 2.8 finale.
  • Le fait que certains modules Qt sont redondants avec la librairie standard (threading, networking...). Une bonne pratique consiste à utiliser les modules Qt lorsque l'on interagit avec un contexte Qt, et les modules de la librairie standard sinon. Il n'en reste pas moins qu'on va potentiellement avoir l'utilisation de plusieurs modules différents pour le même usage final.


Mais en dehors de ça, PySide/PyQt reste pour moi une des solutions idéales pour du GUI cross-platform.

Le problème que j'ai avec le développement C++ pour des applications qui n'ont pas besoin de perfs extraordinaires, c'est que j'ai l'impression que la plus grande partie de ma concentration est verrouillée sur la gestion mémoire pour pas faire de conneries.
La productivité est démultipliée en Python et pour 99% des applications perso que je vais faire, je n'ai pas besoin de la rapidité apportée par le C++. Au pire, l'intégration de code natif est assez aisé.

[HS]
Il y a aussi JavaFx2 qui semble assez intéressant dans ce domaine. Il permet aussi de faire du packaging d'applications pour avoir des apps "self-contained".
Sans oublier aussi le trio JS/HTML/CSS qui commence à arriver sur desktop.
[/HS]
1  0 
Avatar de emmanuel_dumas
Membre habitué https://www.developpez.com
Le 28/06/2013 à 9:13
Bonjour

Au sujet des performances. Beaucoup de choses exacts ont déjà été dites. Je voulais juste revenir sur un point complété par un retour d'expérience personnel :
OK, le C ou C++ génère du code plus rapide et permet des optimisations bas niveaux très efficaces. Mais trop souvent, le développeur C/C++ fini son programme par : "l'implémentation de cet algo est optimisé à fond, pour aller plus vite, il faudrait revoir l'algo, on fera cela quand on aura du temps".
Le développeur Python, qui implémente l'algo vraiment plus vite, je reste grosso-modo sur le chiffre de 5 fois plus vite, lui a bien souvent encore du temps pour non pas travaillé sur l'implémentation de l'algo, mais sur l'algo lui-même et l'architecture globale du programme. Donc au final, il a le temps d'implémenter un autre algo, et le programme est plus rapide.

Donc sur plusieurs retours d'expérience personnel, j'ai vu des programmes Python plus rapide que l'équivalent en C/C++, car le développeur a pu passer plus de temps sur les aspect choix d'algo/architecture du programme.

Cordialement
Emmanuel
1  0 
Avatar de Jiyuu
Rédacteur/Modérateur https://www.developpez.com
Le 21/06/2013 à 20:06
Je tiens déjà à tous vous remercier pour vos votes et/ou commentaires.

Je souhaite réagir sur trois points :

La performance du langage :
À mon sens il existe au moins trois niveaux de performance pour un langage :
  • La performance liée à la rapidité d'écrire le code ;
  • La performance liée à la vitesse d'exécution, de consommation de ressources, ... ;
  • La performance liée à sa maintenabilité dans le sens large du terme (maj, correction bogues, ...) ;


Comme Dourouc et jbb2811 le suggère, je pense que la performance liée à la vitesse de calcul, etc est très relative. Je pense que vous aurez compris que je suis avant tout un codeur Python. J'avoue n'avoir jamais vraiment été gêné de ce coté. Les seules fois où j'ai eu l'impression de ralentissement était bien souvent au moment d'exécuter des requêtes Sql sur un serveur distant, et là je pense que les performances de Python ne sont pas forcément les seules en cause.

D'autre part, bien que je n'ai pas une très grande expérience en C++, j'ai lu ici et là que ce n'était pas la panacée en simplicité de codage, ma faible expérience me fait dire aussi ceci et jbb semble aussi suggérer. Python est, je pense, plus performant de ce coté.

La distribution du code :
Pour le C++, j'utilise depuis longtemps un logiciel écrit dans ce langage et dont les premières versions étaient exclusivement distribuées en version source. Même étant sous windows, je n'ai jamais rencontré de difficulté pour l'utiliser. Je pense que tout peut très bien se passer si c'est bien préparé.

Pour Python, je pense qu'il faut distinguer les applications destinées à tourner sur Win ou sur Linux comme l’indique arnolddumas.
Pour Linux, cela risque d'être beaucoup moins problématique puisque Python est présent de base (et C++ aussi au passage ^^), il ne reste plus qu'à gérer les bibliothèques manquantes.
Pour Win, j'avoue là être un peu plus dans le flou car tous les programmes que j'ai fait actuellement ont soit été exclusivement pour moi (donc j'ai déjà mon Python), soit distribué via un exécutable, et je confirme que cela peut très bien se passer.

Cependant, il existe des solutions dites portables de Python qui peuvent avantageusement être distribuées avec les sources du programme. Je me demande même dans quelle mesure, un simple copier-coller du dossier Python et quelques réglages ne permettraient pas de régler le problème (test en cours )

Quid de la taille du programme ?
Le problème peut venir de là.
En Python et pour des petits à moyens projets on va rapidement atteindre les 350 ou 400Mo… certes ça peut paraitre peu vu les 1 000Go bien souvent disponibles, mais bon...
J’ai aussi dernièrement essayé de créer un exécutable d’un programme exemple fourni avec Qt5.0.2. Si j’ai bien compris, une fois le .exe créé, il est nécessaire d’y ajouter quelques DLL. J’ai été assez surpris de la taille de Qt5Guid.DLL et d’autres… et me dit que finalement, un programme source python distribué avec tout ce qui faut pour le faire tourner n’a pas forcément à rougir.

En espérant que ces quelques remarques permettrons encore d’alimenter le débat, et peut-être de faire réagir des pro-Python

Merci à vous pour votre implication.
0  0