Python netCDF4 Lesegeschwindigkeit und Verschachtelung von for-Anweisungen

Wenn Sie versuchen, meteorologische Daten über einen langen Zeitraum auf verschiedenen Druckebenen zu zeichnen, nimmt die Verschachtelung für Anweisungen und das Lesen von netCDF-Dateien natürlich zu.

Daher habe ich untersucht, wie sich die zum Abrufen eines Datenarrays erforderliche Zeit ändert, indem die Verschachtelungsstruktur der for-Anweisung geändert wird.

Bestätigungscode 1

Für den Bestätigungscode habe ich auf [hier] verwiesen (https://note.nkmk.me/python-timeit-measure/). Die Daten wurden von NCAR's RDA erhalten. Die Daten sind ein Geopotential, eine vierdimensionale Anordnung von [Zeit, Druckebene, Breite, Länge]. Die Zeit beträgt 24 Stunden von 0 bis 23 und das Druckniveau beträgt 37.

func_1 liest die Daten einmal und speichert das dreidimensionale Array in a. Danach wird b durch das Geopotential in jeder Druckebene ersetzt. func_2 liest die Daten für jede Druckebene und erhält jedes Mal ein zweidimensionales Array.

check1.py


import timeit
from netCDF4 import Dataset

def func_1():
    nc = Dataset('../data/era5/Z_2020070100_2020070123.nc', 'r')
    a = nc.variables['Z'][0, :]
    for i in range(len(a)):
        b = a[i, :]
    return 0

def func_2():
    nc = Dataset('../data/era5/Z_2020070100_2020070123.nc', 'r')
    lev = nc.variables['level'][:]
    for i in range(len(lev)):
        b = nc.variables['Z'][0, i, :]
    return 0

loop = 20

result_1 = timeit.timeit(lambda: func_1(), number=loop)
result_2 = timeit.timeit(lambda: func_2(), number=loop)

print('1: ', result_1 / loop)
print('2: ', result_2 / loop)

Ergebnis ist

1:  0.009774951753206551
2:  0.018051519710570573

Es wurde wie. Es gibt einen doppelten Geschwindigkeitsunterschied. Daraus wurde festgestellt, dass die Geschwindigkeit des Lesens des dreidimensionalen Arrays der Geschwindigkeit des Lesens des dreidimensionalen Arrays zu einem Zeitpunkt und der Geschwindigkeit des Lesens des zweidimensionalen Arrays jedes Mal überlegen ist.

Bestätigungscode 2

Da es sich bei den Daten, die Sie verarbeiten möchten, um ein 4-dimensionales Array handelt, überprüfen Sie auch den Fall eines 4-dimensionalen Arrays. Wie beim Bestätigungscode 1 werden "func_1" und "func_2" einmal von "func_1" und jedes Mal von "func_2" gelesen.

check1.py


import timeit
from netCDF4 import Dataset

def func_1():
    nc = Dataset('../data/era5/Z_2020070100_2020070123.nc', 'r')
    a = nc.variables['Z'][0, :]
    for i in range(len(a)):
        b = a[i, :]
    return 0

def func_2():
    nc = Dataset('../data/era5/Z_2020070100_2020070123.nc', 'r')
    lev = nc.variables['level'][:]
    for i in range(len(lev)):
        b = nc.variables['Z'][0, i, :]
    return 0

loop = 10

result_1 = timeit.timeit(lambda: func_1(), number=loop)
result_2 = timeit.timeit(lambda: func_2(), number=loop)

print('1: ', result_1 / loop)
print('2: ', result_2 / loop)

Dann war das Ergebnis wie folgt.

1:  1.4546271565370261
2:  1.3412013622000813

Es stellte sich heraus, dass die Methode zum sofortigen Lesen eines Arrays, die in 3D schnell war, langsamer ist als die Methode zum Lesen jedes Mal in 4D. Bedeutet das, dass die Verarbeitungsgeschwindigkeit langsamer ist als die for-Anweisung, wenn das Array mehrdimensional wird? Es ist ein interessantes Ergebnis. Von nun an dachte ich auch, wenn ich das Beste aus beiden Welten nehmen würde, wäre es ein Programm, das Daten am schnellsten lesen könnte, also verglich ich die Geschwindigkeit des folgenden Codes.

Bestätigungscode 3

Ich habe eine neue func_3 erstellt und die Geschwindigkeit verglichen. func_3 ist eine Funktion, die die Zeit mit einer for-Anweisung dreht und jedes Mal ein dreidimensionales Array [Druckebene, Breite, Länge] liest.

check3.py


from netCDF4 import Dataset
import timeit

def func_1():
    nc = Dataset('../data/era5/Z_2020070100_2020070123.nc', 'r')
    a = nc.variables['Z'][:]
    for i in range(len(a)):
        b = a[i, :]
        for j in range(len(b)):
            c = b[j, :]
    return 0

def func_2():
    nc = Dataset('../data/era5/Z_2020070100_2020070123.nc', 'r')
    time = nc.variables['time'][:]
    lev = nc.variables['level'][:]
    for j in range(len(time)):
        for i in range(len(lev)):
            b = nc.variables['Z'][j, i, :]
    return 0

def func_3():
    nc = Dataset('../data/era5/Z_2020070100_2020070123.nc', 'r')
    time = nc.variables['time'][:]
    for j in range(len(time)):
        a = nc.variables['Z'][j, :]
        for i in range(len(a)):
            b = a[i, :]
    return 0


loop = 10

result_1 = timeit.timeit(lambda: func_1(), number=loop)
result_2 = timeit.timeit(lambda: func_2(), number=loop)
result_3 = timeit.timeit(lambda: func_3(), number=loop)

print('1: ', result_1 / loop)
print('2: ', result_2 / loop)
print('3: ', result_3 / loop)

Das Ergebnis ist wie folgt.

1:  1.4101094176992774
2:  1.344068780587986
3:  1.0753227178938687

Wie zu erwarten war, war func_3 am schnellsten.

Fazit

Was wir aus den drei Überprüfungen gelernt haben

Das ist was es bedeutet. Die Visualisierung meteorologischer Daten ist eine zeitaufwändige Aufgabe. Wir hoffen, dass Sie durch diese Überprüfung Zeit sparen.

Recommended Posts

Python netCDF4 Lesegeschwindigkeit und Verschachtelung von for-Anweisungen
[Python] Schlachten und Kombinationen ausgeben (Verschachtelung für Anweisungen und if-Anweisungen)
Zusammenfassung verschiedener for-Anweisungen in Python
Ich habe die Geschwindigkeit der Listeneinschlussnotation für und während mit Python2.7 gemessen.
Vergleichen Sie die Geschwindigkeit von Python Append und Map
Liste der Python-Bibliotheken für Datenwissenschaftler und Dateningenieure
Verwendung für Python-Stapel und -Warteschlangen (Geschwindigkeitsvergleich jeder Datenstruktur)
Vergleichen Sie die Lese- / Schreibgeschwindigkeit und Kapazität von CSV, Pickle, Joblib und Parkett in einer Python-Umgebung
Quellinstallation und Installation von Python
Tipps zum Codieren kurz und einfach in Python zu lesen
Nützliche Tricks in Bezug auf Listen und Anweisungen in Python
Zusammenfassung der Unterstützung von Hash-Operationen (Dictionary) für Ruby und Python
Umgebungskonstruktion von Python und OpenCV
Ich habe die Geschwindigkeit von Hash mit Topaz, Ruby und Python verglichen
Die Geschichte von Python und die Geschichte von NaN
Geschwindigkeitsvergleich der Volltextverarbeitung von Wiktionary mit F # und Python
Erstellen und testen Sie eine CI-Umgebung für mehrere Versionen von Python
Installation von SciPy und matplotlib (Python)
Lesen und verwenden Sie Python-Dateien aus Python
Dies und das von Python-Eigenschaften
[TouchDesigner] Tipps für die Anweisung von Python
Lesen und Schreiben von NetCDF mit Python
Geschwindigkeitsvergleich der Python-XML-Perspektive
Erste Schritte mit Python3
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Aufzeichnung der Python-Einführung für Neulinge
Zusammenfassung der Python-Indizes und -Slices
Erstellen und lesen Sie Messagepacks in Python
Reputation von Python-Büchern und Nachschlagewerken
Ich habe die numerische Berechnung von Python durch Rust ersetzt und die Geschwindigkeit verglichen
[Python of Hikari-] Kapitel 05-09 Steuerungssyntax (Verwendung von for-Anweisung und while-Anweisung ordnungsgemäß)
Erläuterung zum Erstellen einer Anwendung zum Anzeigen von Bildern und Zeichnen mit Python
Beispiel für Python-Code für die Exponentialverteilung und die wahrscheinlichste Schätzung (MLE)
Installation von Visual Studio Code und Installation von Python
[Python] Protokoll des Studientreffens für Anfänger (7/15)
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Extraktion von tweet.js (json.loads und eval) (Python)
6 Python-Bibliotheken für schnellere Entwicklung und Debugging
Verbinde viel Python oder und und
[Python] Organisieren der Verwendung für Anweisungen
Lesen Sie Python csv und exportieren Sie es nach txt
Lesen und schreiben Sie JSON-Dateien mit Python
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
[Python] Bilder mit OpenCV lesen (für Anfänger)
Zusammenfassung nützlicher Techniken von Scrapy in Python
Einfache Einführung in die Python3-Serie und OpenCV3
[Python] Verschiedene Kombinationen von Zeichenketten und Werten
Gleiche Automatisierung des Python- und PyPI-Setups
[Python] Lesen Sie die HTML-Datei und üben Sie das Scraping
Vollständiges Verständnis von Python-Threading und Multiprocessing
SublimeText2 und SublimeLinter - Syntax prüfen auf Python3--
Projekt Euler # 1 "Vielfaches von 3 und 5" in Python
Geschwindigkeitsvergleich von murmurhash3, md5 und sha1
[Python] Erstellen Sie eine Liste mit Datum und Uhrzeit (Datum / Uhrzeit-Typ) für einen bestimmten Zeitraum
Zusammenfassung zum Lesen numerischer Daten mit Python [CSV, NetCDF, Fortran Binary]
Ich habe die Geschwindigkeit regulärer Ausdrücke in Ruby, Python und Perl (Version 2013) verglichen.
Memo Nr. 4, dass Python-Anfänger "Detaillierte Erklärung der Python-Grammatik" lesen
[Python] Lesen Sie den Quellcode von Flasche Teil 2
Zusammenfassung der Korrespondenz zwischen Ruby- und Python-Array-Operationen
Sofortige Methodengrammatik für Python und Ruby (Lernen)
Die Geschichte, dass die Lernkosten von Python niedrig sind