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).
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.
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.
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