Verwendung der NUITKA-Utilities-Hinweis-Kompilierung zum einfachen Erstellen einer ausführbaren Datei aus einem Python-Skript

Einführung

Wenn Sie ein Python-Skript an eine andere Person übergeben möchten, ist es schwierig, eine Umgebung auf dem PC der anderen Person zu erstellen. Ich möchte es wenn möglich zu einer ausführbaren Datei machen. Pyinstaller und Nuitka sind nützliche Module, um dies zu erreichen. Letzteres soll die Eigenschaften haben, dass die Größe der Ausführungsdatei klein und die Ausführungsgeschwindigkeit hoch ist, nachdem sie in C konvertiert und dann kompiliert wurde.

Nach dem Kompilieren von Nuitka kann es schwierig sein, es auszuführen und zu beheben, wenn ein Importfehler (auch Pyinstaller) auftritt. Führen Sie daher das Python-Skript unter Verwendung der angedeuteten Kompilierung von NUITKA-Dienstprogrammen einmal aus, um das verwendete Modul zu verstehen, und kompilieren Sie es dann, um Fehler zu reduzieren. Es war sehr einfach zu bedienen und praktisch, daher möchte ich es mit einem Vergleich mit Pyinstaller vorstellen.

Referenz

Ich habe hier von NUITKA-Utilities erfahren. Weitere Informationen zur Verwendung anderer Skripte als der Kompilierung mit Hinweisen finden Sie hier. Qiita: Einfache Python-Kompilierung mit NUITKA-Utilities

1. Vorbereitung von NUITKA-Utilities

Laden Sie NUITKA-Utilities herunter. GitHub: NUITKA-Utilities Installieren Sie Nuitka, Pysimplegui und MinGW im Voraus. Im Fall der Anaconda-Umgebung ist dies wie folgt.

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

Die Installation von MinGW ist etwas schwierig und sollte mit der installierten Python-Architektur übereinstimmen. Geben Sie zur Bestätigung Python an der Eingabeaufforderung ein.

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

Installieren Sie MinGW unter Programmieren: Herunterladen und Installieren von MinGW-w64. Im obigen Beispiel ist Python 64-Bit. Ändern Sie daher die Architektur des MinGW-Installationsprogramms in x86_x64. MinGWinstaller.png

Stellen Sie sicher, dass Ihr PFAD korrekt ist.

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.

Wenn Sie den PATH nicht festlegen möchten, weil es ursprünglich eine andere Version gibt, können Sie mingw-w64.bat ausführen, auf dem MinGW installiert ist.

2. Verwendung von NUITKA-Utilities Hinweisen-Kompilierung

Benennen Sie zur Erläuterung die Skriptdatei, die Sie kompilieren möchten, als yourscript.py.

  1. Wechseln Sie in das Verzeichnis NUITKA-Utilities \ hinted-compilation und führen Sie das Skript wie unten gezeigt aus. Das Skript wird ausgeführt und das verwendete Modul wird in die JSON-Datei geschrieben.

    python get-hints.py yourscript.py
    
  2. Führen Sie das Skript dann wie folgt aus: Fügen Sie zu diesem Zeitpunkt Ihre script.py und die vorherige json-Datei in dieselbe Hierarchie ein.

    python nuitka-hints.py yourscript.py
    

Mit genau diesem können Sie eine ausführbare Datei aus einer Python-Skriptdatei erstellen. Wenn Sie die Dateien zu einer kombinieren möchten, verwenden Sie onefile-maker-windows.py.

3. Vergleich von Dateigröße, Ausführungsgeschwindigkeit und Startgeschwindigkeit

Code

Ich habe den Code basierend auf dem Problem geschrieben, das in SPI3 aufgetreten ist. Messen Sie anhand dieses Beispiels die Ausführungsgeschwindigkeit und die Startgeschwindigkeit.

import numpy as np
import time

def coin_prob(N=1000000):
    """
Wirf 1 10 Yen, 2 5 Yen Bälle, 5 1 Yen,
Fügen Sie die Anzahl der Münzen auf dem Tisch hinzu.
Wie hoch ist die Wahrscheinlichkeit, 15 Yen zu werden?
    """
    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 oder 1
        if np.sum(coins*heads_or_tails) == 15:
            count += 1
    print("Die Wahrscheinlichkeit ist{}".format(count/N))

def main():
    """
Finden Sie die durchschnittliche Zeit und Standardabweichung von 10 mal.
    """
    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("Verarbeitungszeit={0}±{1}".format(ave_time,std_time))

if __name__ == "__main__":
    start_all = time.time()
    main()
    end_all = time.time()
    print("Verstrichene Gesamtzeit{}".format(end_all-start_all))

Weder Pyinstaller noch Nuitka haben die Möglichkeit, sie in einer Datei zu kombinieren.

Abgesehen davon liefen sowohl Pyinstaller als auch Nuitka nicht reibungslos und litten ein wenig. Pyinstaller hat es unter Bezugnahme auf diesen Artikel gelöst. Laufzeitfehler vermeiden ModuleNotFoundError für ausführbare Dateien, die mit Qiita: Pyinstaller aus Python-Code generiert wurden Nuitka hat wegen mkl nicht funktioniert, also habe ich es hier gelöst. Hinweise zu Nuupan: Was tun, wenn mkl unter der Conda-Umgebung nicht geladen werden kann

Dateigröße

Am Anfang sagte Nuitka, die Dateigröße sei klein, aber nicht. Ich hoffe, es wird weiter verbessert und es werden keine zusätzlichen Module importiert.

Original Pyinstaller Nuitka
1.02KB 569MB 623MB

Ausführungsgeschwindigkeit

Die Verarbeitungszeit für einen Satz von Münzwurfversuchen ist der Durchschnitt und die Standardabweichung von 10. Obwohl dies nicht in Frage kommt, habe ich auch Numba Jit in den Vergleich einbezogen. Wenn Sie beschleunigen möchten, sollten Sie dies verwenden.

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

Startgeschwindigkeit

Die Zeit vom Start bis zum Ende des Programms wurde mit timeit.exe der Windows Server 2003 Resource Kit-Tools gemessen, und der Unterschied zur Verarbeitungszeit der Hauptfunktion innerhalb des Programms wurde dreimal gemessen.

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

Zusammenfassung

Mit Ausnahme der Dateigröße übertraf es Pyinstaller in Bezug auf Ausführungsgeschwindigkeit und Startgeschwindigkeit. Es wird empfohlen, da es weniger Fehler aufweist und einfacher als Pyinstaller ist.

Recommended Posts

Verwendung der NUITKA-Utilities-Hinweis-Kompilierung zum einfachen Erstellen einer ausführbaren Datei aus einem Python-Skript
Python-Skript, das eine JSON-Datei aus einer CSV-Datei erstellt
So erstellen Sie eine JSON-Datei in Python
Ich habe ein Paket erstellt, um eine ausführbare Datei aus dem Hy-Quellcode zu erstellen
So führen Sie ein Python-Programm in einem Shell-Skript aus
[Python Kivy] So erstellen Sie mit pyinstaller eine exe-Datei
[Python] So geben Sie eine Pandas-Tabelle in eine Excel-Datei aus
So erstellen Sie eine Konfigurationsdatei
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
Erstellen Sie ein Shell-Skript, um die Python-Datei mehrmals auszuführen
So erstellen Sie einen Klon aus Github
So konvertieren Sie Python in eine exe-Datei
Erstellen Sie eine Deb-Datei aus einem Python-Paket
So erstellen Sie ein Repository aus Medien
Verwenden Sie Django aus einem lokalen Python-Skript
Skript zum Erstellen einer Mac-Wörterbuchdatei
So führen Sie Maya Python-Skripte aus
Verwenden Sie BeautifulSoup, um einen Link mit einer Zeichenfolge aus einer HTML-Datei zu extrahieren
Bearbeiten Sie Excel in Python, um eine Pivot-Tabelle zu erstellen
Lesen einer CSV-Datei mit Python 2/3
So öffnen Sie einen Webbrowser über Python
Studie aus Python Hour7: Verwendung von Klassen
Erstellen Sie eine Datei, die in der Skriptsprache ausgeführt werden kann
Erstellen Sie eine neue Todoist-Aufgabe aus Python Script
So generieren Sie ein Python-Objekt aus JSON
[Python] So löschen Sie einfach einen untergeordneten Prozess, der durch Multiprozess gestartet wurde, von einem anderen Prozess
So erstellen Sie einen Artikel über die Befehlszeile
Backtrader So importieren Sie einen Indikator aus einer anderen Datei
Ein Memorandum zum Ausführen eines Python-Skripts in einer Bat-Datei
So erstellen Sie ein einfaches TCP-Server / Client-Skript
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Eine Geschichte darüber, wie Windows 10-Benutzer eine Umgebung für die Verwendung von OpenCV3 mit Python 3.5 erstellt haben
So erstellen Sie mit Python ein radiales Profil aus astronomischen Bildern (Chandra, XMM usw.)
python3: Verwendung der Flasche (2)
[Python] Verwendung von Liste 1
Wie benutzt man Python Argparse?
Python: Wie man pydub benutzt
[Python] Verwendung von checkio
Wie benutzt man Python Lambda?
[Python] Verwendung von virtualenv
python3: Verwendung der Flasche (3)
python3: Wie man eine Flasche benutzt
Verwendung von Python-Bytes
So schneiden Sie ein Block-Multiple-Array aus einem Multiple-Array in Python
So konvertieren Sie mit Python [Anwendung] von einem Array in ein Wörterbuch
Ein Python-Skript, das ein GTK-Bild (Clipboard) in einer Datei speichert.
Verwendung der Methode __call__ in der Python-Klasse
So starten Sie AWS Batch über die Python-Client-App
So importieren Sie Dateien in Python an eine beliebige Stelle
So generieren Sie einen öffentlichen Schlüssel aus einem privaten SSH-Schlüssel
Wie erstelle ich ein Python-Paket (geschrieben für Praktikanten)
[Python Kivy] So erstellen Sie ein einfaches Popup-Fenster
So verwenden Sie eine andere Datei als .fabricrc als Konfigurationsdatei
Lesen einer Excel-Datei (.xlsx) mit Pandas [Python]
So erstellen Sie eine ISO-Datei (CD-Image) unter Linux