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.
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
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.
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.
Benennen Sie zur Erläuterung die Skriptdatei, die Sie kompilieren möchten, als yourscript.py.
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
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.
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
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 |
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 |
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 |
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