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.
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
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.
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é.
Pour des raisons d'explication, nommez le fichier de script que vous souhaitez compiler comme yourscript.py.
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
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.
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
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 |
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 |
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 |
À 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