Vitesse de lecture Python netCDF4 et imbrication d'instructions for

Si vous essayez de tracer des données météorologiques sur différents plans de pression sur une longue période, l'imbrication par les déclarations for et la lecture des fichiers netCDF augmenteront naturellement.

Par conséquent, j'ai étudié comment le temps nécessaire pour obtenir un tableau de données change en modifiant la structure d'imbrication de l'instruction for.

Code de vérification 1

Pour le code de vérification, je me suis référé à ici. Les données ont été obtenues auprès du NCAR's RDA. Les données sont un géopotentiel, un tableau à quatre dimensions de [temps, plan de pression, latitude, longitude]. Le temps est de 24 heures de 0 à 23 et le niveau de pression est de 37.

func_1 lit les données une fois et stocke le tableau tridimensionnel dans un fichier. Après cela, le géopotentiel à chaque plan de pression est remplacé par b. func_2 lit les données pour chaque plan de pression et obtient à chaque fois un tableau bidimensionnel.

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)

Le résultat est

1:  0.009774951753206551
2:  0.018051519710570573

C'est devenu comme. Il y a une double différence de vitesse. À partir de là, il a été constaté que la vitesse de lecture du tableau tridimensionnel est supérieure à la vitesse de lecture du tableau tridimensionnel à un instant et à la vitesse de lecture du tableau bidimensionnel à chaque fois.

Code de vérification 2

Étant donné que les données que vous souhaitez gérer sont un tableau à 4 dimensions, vérifiez également le cas d'un tableau à 4 dimensions. Comme pour le code de vérification 1, func_1 et func_2 sont lus une fois par func_1 et lus par func_2 à chaque fois.

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)

Ensuite, le résultat était le suivant.

1:  1.4546271565370261
2:  1.3412013622000813

Il s'est avéré que la méthode de lecture d'un tableau à la fois, qui était rapide en 3D, est plus lente que la méthode de lecture à chaque fois dans 4D. Cela signifie-t-il que si le tableau devient multidimensionnel, la vitesse de traitement sera plus lente que l'instruction for? C'est un résultat intéressant. Aussi, à partir de maintenant, je pensais que si je prenais le meilleur des deux mondes, ce serait un programme qui pourrait lire les données le plus rapidement, j'ai donc comparé la vitesse du code suivant.

Code de vérification 3

J'ai créé un nouveau func_3 et comparé la vitesse. func_3 est une fonction qui transforme le temps avec une instruction for et lit un tableau tridimensionnel [plan de pression, latitude, longitude] pour chaque fois.

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)

Le résultat est le suivant.

1:  1.4101094176992774
2:  1.344068780587986
3:  1.0753227178938687

Comme vous vous en doutez, func_3 était le plus rapide.

Conclusion

Ce que nous avons appris des trois vérifications

C'est ce que cela signifie. La visualisation des données météorologiques est une tâche qui prend du temps. Nous espérons que cette vérification vous fera gagner du temps.

Recommended Posts

Vitesse de lecture Python netCDF4 et imbrication d'instructions for
[Python] Batailles et combinaisons de sortie (imbrication pour les instructions et les instructions if)
Résumé de diverses instructions for en Python
J'ai mesuré la vitesse de la notation d'inclusion de liste, pendant et pendant avec python2.7.
Comparez la vitesse d'ajout et de carte Python
Liste des bibliothèques Python pour les data scientists et les data ingénieurs
Quoi utiliser pour les piles et les files d'attente Python (comparaison de vitesse de chaque structure de données)
Comparez la vitesse de lecture / écriture et la capacité de csv, pickle, joblib, parquet dans un environnement python
Installation source et installation de Python
Conseils pour coder courts et faciles à lire en Python
Astuces utiles liées à la liste et aux instructions en Python
Résumé de la prise en charge des opérations de hachage (dictionnaire) pour Ruby et Python
Construction d'environnement de python et opencv
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
L'histoire de Python et l'histoire de NaN
Comparaison de vitesse du traitement de texte intégral de Wiktionary avec F # et Python
Créer et tester un environnement CI pour plusieurs versions de Python
Installer SciPy et matplotlib (Python)
Lire et utiliser des fichiers Python à partir de Python
Ceci et cela des propriétés python
[TouchDesigner] Conseils pour la déclaration par python
Lire et écrire NetCDF avec Python
Comparaison de la vitesse de la perspective XML Python
Premiers pas avec python3
Coexistence de Python2 et 3 avec CircleCI (1.0)
Enregistrement de l'introduction de Python pour les nouveaux arrivants
Résumé des index et des tranches Python
Créer et lire des paquets de messages en Python
Réputation des livres Python et des livres de référence
J'ai remplacé le calcul numérique de Python par Rust et comparé la vitesse
[Python of Hikari-] Chapitre 05-09 Syntaxe de contrôle (utilisation correcte des instructions for et while)
Explication de la création d'une application pour afficher des images et dessiner avec Python
Exemple de code python pour la distribution exponentielle et l'estimation la plus probable (MLE)
Installation du code Visual Studio et installation de python
[Python] Compte-rendu de la réunion d'étude pour les débutants (7/15)
différence entre les instructions (instructions) et les expressions (expressions) en Python
Extraction de tweet.js (json.loads et eval) (Python)
6 bibliothèques Python pour un développement et un débogage plus rapides
Connectez beaucoup de Python ou et et
[Python] Organisation de l'utilisation des instructions
Lire Python csv et exporter vers txt
Lire et écrire des fichiers JSON avec Python
Pandas du débutant, par le débutant, pour le débutant [Python]
[Python] Lire des images avec OpenCV (pour les débutants)
Résumé des techniques utiles de Scrapy en Python
Introduction facile de la série python3 et d'OpenCV3
[Python] Diverses combinaisons de chaînes de caractères et de valeurs
Automatisation égale de l'installation de Python et PyPI
[python] Lisez le fichier html et entraînez-vous au scraping
Compréhension complète du threading Python et du multitraitement
SublimeText2 et SublimeLinter - Vérification de la syntaxe pour Python3 -
Projet Euler # 1 "Multiple de 3 et 5" en Python
Comparaison de vitesse de murmurhash3, md5 et sha1
[Python] Créer une liste de date et d'heure (type datetime) pour une certaine période
Résumé de la lecture des données numériques avec python [CSV, NetCDF, Fortran binary]
J'ai comparé la vitesse des expressions régulières en Ruby, Python et Perl (version 2013)
Mémo n ° 4 que les débutants Python lisent "Explication détaillée de la grammaire Python"
[Python] Lire le code source de Bottle Part 2
Résumé de la correspondance entre les opérations de tableau ruby et python
Grammaire de méthode instantanée pour Python et Ruby (étude)
L'histoire selon laquelle le coût d'apprentissage de Python est faible