Évaluation de la vitesse de sortie du fichier CSV en Python

Contexte

Il y a quelque temps, j'ai publié un article "Je veux effectuer un traitement de somme d'éléments de tableau à haute vitesse avec Google Apps Script". À ce moment-là, je n'avais pas l'intention de l'utiliser ailleurs, j'ai donc créé la bibliothèque uniquement pour GAS, mais récemment, j'ai également touché un grand tableau en Python, donc je vais envisager une méthode pour générer des données de tableau dans un fichier csv. fait.

Lors de mes recherches, je suis tombé sur l'article d'Okadate. L'article dit qu'il existe un module csv et un module pandas pour générer un fichier csv. Étant donné que la quantité de données traitées est importante, j'étais toujours préoccupé par sa vitesse de traitement, j'ai donc décidé de la vérifier avant le fonctionnement normal.

Par conséquent, nous avons évalué la vitesse de traitement de la sortie csv du module csv et du module pandas. Pour référence, j'ai utilisé une méthode standard utilisant l'opérateur "+", un portage de la bibliothèque de traitement de somme GAS vers Python (souwapy).

Méthode d'évaluation

J'ai utilisé le module suivant pour évaluer la vitesse de sortie du fichier csv. Les spécifications de l'ordinateur utilisé pour la mesure sont: CPU Core i5-3210M, Mémoire 8 Go, OS Windows10 (x64) (v1607). La version Python est 3.5.2.

Nom du module Remarques
csv Inclut la bibliothèque Python standard
pandas Module d'analyse de données Python, version 0.19.0
souwapy Fabrication artisanale, version 1.1.1
standard algorithm Méthode générale d'ajout d'éléments de tableau dans l'ordre

Le script utilisé pour l'évaluation de la vitesse est le suivant.

python


#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import time
import csv
import pandas as pd
import SOUWA


def measure_csv(ar):
    start = time.time()
    with open('csvmod.csv', 'w') as f:
        writer = csv.writer(f, lineterminator='\n')
        writer.writerows(ar)
    Processing_time = time.time() - start
    print("Processing time = {0}".format(Processing_time) + " [s]")
    return


def measure_pandas(ar):
    start = time.time()
    df = pd.DataFrame(ar)
    df.to_csv('pandastest.csv', header=False, index=False)
    Processing_time = time.time() - start
    print("Processing time = {0}".format(Processing_time) + " [s]")
    return


def measure_souwapy(ar):
    start = time.time()
    s = SOUWA.sou()
    result = s.getcsvdata(ar, ",", "\n")
    with open('souwa.csv', 'w') as f:
        f.write(result)
    Processing_time = time.time() - start
    print("Processing time = {0}".format(Processing_time) + " [s]")
    return


def measure_standard(ar):
    start = time.time()
    result = ''
    for dat in ar:
        result += ",".join(dat) + "\n"
    with open('standard.csv', 'w') as f:
        f.write(result)
    Processing_time = time.time() - start
    print("Processing time = {0}".format(Processing_time) + " [s]")
    return


def MakeArray(row):
    theta = [0 for i in range(row)]
    for i in range(0, row):
        theta[i] = [str(i + 1).zfill(9), 'a', 'b', 'c', 'd', 'e']
    return theta


ar = MakeArray(10)

measure = 1

if measure == 1:
    measure_csv(ar)
elif measure == 2:
    measure_pandas(ar)
elif measure == 3:
    measure_souwapy(ar)
elif measure == 4:
    measure_standard(ar)

Pour le tableau en tant que données, nous avons utilisé une chaîne de nombres à 9 chiffres remplis de zéro et un tableau unidimensionnel à 6 éléments des alphabets a --e. C'est exactement le contenu des données que vous voulez transformer en fichier csv pendant l'opération. Ici, tous les éléments sont remplis de zéro pour correspondre à la taille des données, et chaque alphabet est également un caractère. Les données du fichier csv avec le nombre de séquences défini sur 10 sont les suivantes.

000000001,a,b,c,d,e
000000002,a,b,c,d,e
000000003,a,b,c,d,e
000000004,a,b,c,d,e
000000005,a,b,c,d,e
000000006,a,b,c,d,e
000000007,a,b,c,d,e
000000008,a,b,c,d,e
000000009,a,b,c,d,e
000000010,a,b,c,d,e

"," Est utilisé comme délimiteur et "\ n" est utilisé comme code de saut de ligne. Le total de ces derniers est de 20 octets par ligne. Nous avons également confirmé que le module csv, le module pandas, le module souwapy et l'algorithme standard ont tous les mêmes données. L'évaluation de la vitesse était ciblée jusqu'à la sortie du fichier csv du tableau.

Résultats de l'évaluation

fig.png

Le résultat est montré dans la figure ci-dessus. L'axe horizontal correspond au nombre d'éléments du tableau et l'axe vertical correspond au temps nécessaire pour terminer la sortie du fichier csv. Le bleu, le rouge, l'orange et le vert sont respectivement dus à l'algorithme standard, au module pandas, au module csv et au module souwapy. En conséquence, il a été constaté que le temps de traitement pour la sortie des données de séquence dans le fichier csv est plus rapide dans l'ordre standard, module pandas, module csv et module souwapy. Le rapport de temps moyen de traitement était 1,4 fois plus rapide pour le module csv que pour le module pandas, 2,3 fois plus rapide pour le module souwapy que pour le module csv, et 3,1 fois plus rapide pour le module souwapy que pour le module pandas.

Si vous regardez de plus près, dans l'algorithme standard, le temps de traitement est proportionnel au carré du nombre d'éléments. [On sait que dans la méthode standard d'ajout de tableaux dans l'ordre en utilisant l'opérateur "+", la quantité totale de données en mouvement pendant le traitement augmente proportionnellement au carré du nombre d'éléments du tableau](http: // qiita.com/tanaike/items/17c88c69a0aa0b8b18d7). Par contre, dans chaque module, le temps de traitement est linéairement proportionnel au nombre d'éléments. À partir de ceux-ci, on peut déduire que le module csv et le module pandas subissent un traitement d'optimisation lors du passage aux données csv. J'ai essayé de savoir quel type d'algorithme csv et pandas utilisent pour convertir un tableau en fichier csv, mais malheureusement je n'ai pas pu l'atteindre moi-même.

Si le nombre d'éléments est petit, vous pouvez juger qu'il n'y a pas de grande différence de temps de traitement entre chaque module. L'effet apparaît lorsque le nombre d'éléments augmente. Le module souwapy a un résultat rapide car il utilise un algorithme spécialisé pour convertir des données de tableau en données csv, mais jusqu'à présent, il n'a qu'une seule fonction, donc il a d'autres fonctions avancées. J'ai pensé que ce serait bien de le combiner avec un module et de ne l'utiliser que dans la sortie finale du fichier csv.

prime

Le module souwapy est un port de la bibliothèque pour GAS. Cela semblait efficace lorsque le nombre d'éléments augmentait, alors je l'ai téléchargé sur PyPI si cela pouvait être utile. La méthode d'installation et la méthode d'utilisation sont les suivantes.

Jusqu'à présent, il n'a que la capacité de faire la somme du tableau. Je voudrais l'ajouter lorsque d'autres fonctions seront nécessaires à l'avenir.

--Comment installer

$ pip install souwapy

python


from souwapy import SOUWA

s = SOUWA.sou()
result = s.getcsvdata(array, ",", "\n")

array est un tableau, et veuillez changer le délimiteur et le code de saut de ligne à tout moment. Voir ci-dessous pour plus de détails.

Recommended Posts

Évaluation de la vitesse de sortie du fichier CSV en Python
Sortie vers un fichier csv avec Python
CSV en Python
Entrée / sortie de données en Python (CSV, JSON)
Opérations sur les fichiers en Python
Sortie du nombre de cœurs de processeur en Python
Traitement de fichiers en Python
Manipulation de fichiers avec Python
Translocation de fichiers CSV en Python Partie 2: Mesure des performances
Sortie sous la forme d'un tableau python
Sortie japonaise avec Python
Lire le fichier csv Python
Différentes façons de lire la dernière ligne d'un fichier csv en Python
Enregistrez collectivement des données dans Firestore à l'aide d'un fichier csv en Python
Afficher le résultat de sortie de sklearn.metrics.classification_report sous forme de fichier CSV
résumé lié à l'opération de fichier python
Jugement d'équivalence d'objet en Python
Implémentation du tri rapide en Python
Télécharger le fichier csv avec python
Lire la sortie Fortran avec python
Comparez la vitesse de lecture / écriture et la capacité de csv, pickle, joblib, parquet dans un environnement python
Sortie de la table spécifiée de la base de données Oracle en Python vers Excel pour chaque fichier
[Python] Ouvrez le fichier csv dans le dossier spécifié par pandas
Changer la destination de sortie standard en un fichier en Python
[Note] Importation de fichiers dans le répertoire parent en Python
Google recherche la chaîne sur la dernière ligne du fichier en Python
Translocation de fichiers CSV avec Python Partie 1
Manipulation des pixels d'image en Python
Manipulation de chemin de fichier / dossier en Python
Sortie de la liste du vendredi Premium 2017 en Python
Chiffrement facile du contenu des fichiers (Python)
Conseils sur l'entrée / la sortie de fichier Python
[Python] Ecrire dans un fichier csv avec Python
Enregistrez le fichier binaire en Python
Création de Linebot et partage de fichiers avec Python
Diviser timedelta dans la série Python 2.7
Échappement automatique des paramètres MySQL en python
Rendre la sortie standard non bloquante en Python
Implémentation du jeu de vie en Python
Créer un fichier binaire en Python
Affichage de la forme d'onde audio en Python
Lecture et écriture de fichiers CSV Python
L'histoire du "trou" dans le fichier
Notes pour l'entrée / sortie de fichier Python
Exporter et exporter des fichiers en Python
La loi des nombres en python
Implémentation du tri original en Python
Comparaison de la vitesse de la perspective XML Python
ORC, opérations de fichier Parquet en Python
Brouillage réversible d'entiers en Python
Exportez le contenu de ~ .xlsx dans le dossier en HTML avec Python
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Fonction pour ouvrir un fichier en Python3 (différence entre open et codecs.open et comparaison de vitesse)
Conversion de la chaîne <-> date (date, datetime) en Python
[Python] Comment convertir un fichier db en csv
Utilisation du fichier de contraintes ajouté dans pip 7.1
Changer la longueur des chaînes csv Python
Vérifiez le comportement du destroyer en Python
Pratique d'utilisation de ceci en Python (mauvais)