Comment utiliser NUITKA-Utilities hinted-compilation pour créer facilement un fichier exécutable à partir d'un script Python

introduction

Lorsque vous souhaitez transmettre un script Python à une autre personne, il est difficile de créer un environnement sur le PC de l'autre personne. J'aimerais en faire un fichier exécutable si possible. Pyinstaller et Nuitka sont des modules utiles pour y parvenir. Ce dernier est dit avoir les caractéristiques que la taille du fichier d'exécution est petite et la vitesse d'exécution est rapide, après conversion en C puis compilation.

Après avoir compilé Nuitka, il peut être difficile de l'exécuter et de le réparer si vous obtenez une erreur d'importation (également Pyinstaller). Par conséquent, à l'aide de la compilation suggérée de NUITKA-Utilities, exécutez le script Python une fois pour comprendre le module utilisé, puis compilez-le pour réduire les échecs. C'était très facile à utiliser et pratique, je voudrais donc le présenter avec une comparaison avec Pyinstaller.

référence

J'ai découvert NUITKA-Utilities ici. Veuillez vous référer ici pour savoir comment utiliser des scripts autres que la compilation hinted. Qiita: compilation Python facile avec NUITKA-Utilities

1. Préparation des utilitaires NUITKA

Téléchargez NUITKA-Utilities. GitHub: NUITKA-Utilities Installez nuitka, pysimplegui et MinGW à l'avance. Dans le cas de l'environnement Anaconda, c'est comme suit.

conda install -c conda-forge nuitka
conda install -c conda-forge pysimplegui

L'installation de MinGW est un peu délicate et doit correspondre à l'architecture Python installée. Tapez Python à l'invite de commande pour confirmer.

C:\>python
Python 3.7.4 (default, Aug  9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, 
Inc. on win32

Installez MinGW en vous référant à Programmation Let's: Téléchargement et installation de MinGW-w64. Dans l'exemple ci-dessus, Python est 64 bits, changez donc l'architecture du programme d'installation MinGW en x86_x64. MinGWinstaller.png

Assurez-vous que votre PATH est correct.

C:\>gcc --version
gcc (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Si vous ne souhaitez pas définir le PATH car il existe une autre version à l'origine, vous pouvez exécuter mingw-w64.bat où MinGW est installé.

2. Comment utiliser NUITKA-Utilities hinted-compilation

Pour des raisons d'explication, nommez le fichier de script que vous souhaitez compiler comme yourscript.py.

  1. Accédez au répertoire NUITKA-Utilities \ hinted-compilation et exécutez le script comme indiqué ci-dessous. Le script est exécuté et le module utilisé est écrit dans le fichier json.

    python get-hints.py yourscript.py
    
  2. Exécutez ensuite le script comme suit: À ce stade, placez yourscript.py et le fichier json précédent dans la même hiérarchie.

    python nuitka-hints.py yourscript.py
    

Avec juste cela, vous pouvez créer un fichier exécutable à partir d'un fichier de script Python. Si vous souhaitez combiner les fichiers en un seul, utilisez onefile-maker-windows.py.

3. Comparaison de la taille du fichier, de la vitesse d'exécution et de la vitesse de démarrage

code

J'ai écrit le code en fonction du problème survenu dans SPI3. En utilisant ceci comme exemple, mesurez la vitesse d'exécution et la vitesse de démarrage.

import numpy as np
import time

def coin_prob(N=1000000):
    """
Lancer 1 balles de 10 yens, 2 balles de 5 yens, 5 1 yens,
Ajoutez la quantité de pièces sur la table.
Quelle est la probabilité de devenir 15 yens?
    """
    coins = np.array([10,5,5,1,1,1,1,1])
    count=0
    for _ in range(N):
        heads_or_tails = np.random.randint(0,2,len(coins)) #0 ou 1
        if np.sum(coins*heads_or_tails) == 15:
            count += 1
    print("La probabilité est{}".format(count/N))

def main():
    """
Trouvez le temps moyen et l'écart type de 10 fois.
    """
    elapsed_times = []
    for _ in range(10):
        start = time.time()
        coin_prob()
        end = time.time()
        elapsed_times.append(end-start)

    ave_time = np.average(elapsed_times)
    std_time = np.std(elapsed_times)
    print("temps de traitement={0}±{1}".format(ave_time,std_time))

if __name__ == "__main__":
    start_all = time.time()
    main()
    end_all = time.time()
    print("Temps total écoulé{}".format(end_all-start_all))

Ni Pyinstaller ni Nuitka n'ont la possibilité de les combiner en un seul fichier.

En passant, Pyinstaller et Nuitka ne se sont pas bien déroulés et ont un peu souffert. Pyinstaller l'a résolu en se référant à cet article. Évitez l'erreur d'exécution ModuleNotFoundError pour les fichiers exécutables générés à partir du code Python à l'aide de Qiita: Pyinstaller Nuitka n'a pas fonctionné à cause de mkl, alors je l'ai résolu ici. Notes sur Nuupan: Que faire si mkl ne parvient pas à se charger dans l'environnement conda

Taille du fichier

Au début, Nuitka a déclaré que la taille du fichier était petite, mais ce n'était pas le cas. J'espère qu'il continuera à être amélioré et n'importera pas de modules supplémentaires.

Original Pyinstaller Nuitka
1.02KB 569MB 623MB

Vitesse d'exécution

Le temps de traitement pour une série d'essais de lancer de pièces est la moyenne et l'écart type de 10 fois. Bien que ce soit hors de question, j'ai également inclus Numba jit dans la comparaison. Si vous voulez accélérer, vous devriez l'utiliser.

Original Pyinstaller Nuitka Numba jit
Time s 18.44±0.54 18.30±0.26 4.275±0.076 0.2299±0.1281
Gain 1.000 1.008 4.314 80.21

Vitesse de démarrage

Le temps entre le début et la fin du programme a été mesuré avec timeit.exe des outils du Kit de ressources Windows Server 2003, et la différence par rapport au temps de traitement de la fonction principale à l'intérieur du programme a été mesurée trois fois.

Original Pyinstaller Nuitka
Time ms 213.3±2.8 235.8±2.2 88.39±1.72
Gain 1.000 0.905 2.414

Résumé

À l'exception de la taille du fichier, il a surpassé Pyinstaller en termes de vitesse d'exécution et de vitesse de démarrage. Il est recommandé car il comporte moins d'erreurs et est plus facile que Pyinstaller.

Recommended Posts

Comment utiliser NUITKA-Utilities hinted-compilation pour créer facilement un fichier exécutable à partir d'un script Python
Script Python qui crée un fichier JSON à partir d'un fichier CSV
Comment créer un fichier JSON en Python
J'ai créé un package pour créer un fichier exécutable à partir du code source Hy
Comment exécuter un programme Python à partir d'un script shell
[Python Kivy] Comment créer un fichier exe avec pyinstaller
[Python] Comment générer une table pandas dans un fichier Excel
Comment créer un fichier de configuration
Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python
Créez un script shell pour exécuter le fichier python plusieurs fois
Comment créer un clone depuis Github
Comment convertir Python en fichier exe
Créer un fichier deb à partir d'un package python
Comment créer un référentiel à partir d'un média
Utiliser Django à partir d'un script Python local
Script pour créer un fichier de dictionnaire Mac
Comment exécuter des scripts Maya Python
Utilisez BeautifulSoup pour extraire un lien contenant une chaîne d'un fichier HTML
Modifier Excel à partir de Python pour créer un tableau croisé dynamique
Comment lire un fichier CSV avec Python 2/3
Comment ouvrir un navigateur Web à partir de python
Étude de Python Hour7: Comment utiliser les classes
Créer un fichier qui peut être exécuté dans le langage de script
Créer une nouvelle tâche Todoist à partir d'un script Python
Comment générer un objet Python à partir de JSON
[Python] Comment supprimer facilement un processus enfant lancé par multiprocessus à partir d'un autre processus
Comment créer un article à partir de la ligne de commande
Backtrader Comment importer un indicateur depuis un autre fichier
Un mémorandum pour exécuter un script python dans un fichier bat
Comment créer un simple script serveur / client TCP
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Une histoire sur la façon dont les utilisateurs de Windows 10 ont créé un environnement pour utiliser OpenCV3 avec Python 3.5
Comment créer un profil radial à partir d'images astronomiques (Chandra, XMM etc.) en utilisant python
python3: Comment utiliser la bouteille (2)
[Python] Comment utiliser la liste 1
Comment utiliser Python Argparse
Python: comment utiliser pydub
[Python] Comment utiliser checkio
Comment utiliser Python lambda
[Python] Comment utiliser virtualenv
python3: Comment utiliser la bouteille (3)
python3: Comment utiliser la bouteille
Comment utiliser les octets Python
Comment découper un bloc de plusieurs tableaux à partir d'un multiple en Python
Comment convertir un tableau en dictionnaire avec Python [Application]
Un script Python qui enregistre une image de presse-papiers (GTK) dans un fichier.
Comment utiliser la méthode __call__ dans la classe Python
Comment lancer AWS Batch à partir de l'application cliente Python
Comment importer des fichiers où vous le souhaitez en Python
Comment générer une clé publique à partir d'une clé privée SSH
Comment créer un package Python (écrit pour un stagiaire)
[Python Kivy] Comment créer une simple fenêtre pop-up
Comment utiliser un fichier autre que .fabricrc comme fichier de configuration
Comment lire un fichier Excel (.xlsx) avec Pandas [Python]
Comment créer un fichier ISO (image CD) sous Linux