Vor einiger Zeit veröffentlichte ich einen Artikel "Ich möchte die Summenverarbeitung von Array-Elementen mit hoher Geschwindigkeit mit Google Apps Script durchführen". Zu diesem Zeitpunkt hatte ich keine Pläne, es anderweitig zu verwenden, daher habe ich die Bibliothek nur für GAS erstellt. Vor kurzem habe ich jedoch auch ein großes Array in Python berührt, sodass ich eine Methode zur Ausgabe von Array-Daten in eine CSV-Datei in Betracht ziehen werde. tat.
Während der Recherche bin ich auf [Okadates Artikel] gestoßen (http://qiita.com/okadate/items/c36f4eb9506b358fb608). Der Artikel besagt, dass es ein CSV-Modul und ein Pandas-Modul gibt, um eine CSV-Datei auszugeben. Da die Menge der verarbeiteten Daten sehr groß ist, war ich immer noch besorgt über die Verarbeitungsgeschwindigkeit und habe mich daher entschlossen, sie vor dem normalen Betrieb zu überprüfen.
Daher haben wir die Verarbeitungsgeschwindigkeit der CSV-Ausgabe des CSV-Moduls und des Pandas-Moduls bewertet. Als Referenz habe ich eine Standardmethode verwendet, die den Operator "+" verwendet, einen Port der GAS-Summenverarbeitungsbibliothek nach Python (Souwapy).
Ich habe das folgende Modul verwendet, um die Geschwindigkeit der Ausgabe von CSV-Dateien zu bewerten. Die Spezifikationen des für die Messung verwendeten Computers sind CPU Core i5-3210M, Speicher 8 GB, Betriebssystem Windows 10 (x64) (v1607). Die Python-Version ist 3.5.2.
Modulname | Bemerkungen |
---|---|
csv | Enthält die Standard-Python-Bibliothek |
pandas | Python-Datenanalysemodul, Version 0.19.0 |
souwapy | Selbst gemacht, Version 1.1.1 |
standard algorithm | Allgemeine Methode zum Hinzufügen von Array-Elementen in der angegebenen Reihenfolge |
Das für die Geschwindigkeitsbewertung verwendete Skript lautet wie folgt.
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)
Für das Array als Daten verwendeten wir eine 9-stellige, mit Nullen aufgefüllte Zahlenfolge und ein eindimensionales Array mit 6 Elementen der Alphabete a - e. Dies ist genau der Inhalt der Daten, die Sie während des Betriebs in eine CSV-Datei umwandeln möchten. Hier werden alle Elemente mit Nullen aufgefüllt, um der Datengröße zu entsprechen, und jedes Alphabet besteht auch aus einem Zeichen. Die Daten in der CSV-Datei mit der auf 10 eingestellten Sequenzanzahl lauten wie folgt.
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
"," Wird als Trennzeichen und "\ n" als Zeilenvorschubcode verwendet. Die Summe davon beträgt 20 Bytes pro Zeile. Wir haben auch bestätigt, dass das CSV-Modul, das Pandas-Modul, das Souwapy-Modul und der Standardalgorithmus alle dieselben Daten haben. Die Geschwindigkeitsbewertung wurde bis zur Ausgabe der CSV-Datei aus dem Array durchgeführt.
Das Ergebnis ist in der obigen Abbildung dargestellt. Die horizontale Achse ist die Anzahl der Array-Elemente, und die vertikale Achse ist die Zeit, die erforderlich ist, um die Ausgabe der CSV-Datei abzuschließen. Blau, Rot, Orange und Grün sind auf den Standardalgorithmus, das Pandas-Modul, das CSV-Modul bzw. das Souwapy-Modul zurückzuführen. Als Ergebnis wurde festgestellt, dass die Verarbeitungszeit für die Ausgabe von Array-Daten in eine CSV-Datei in der Reihenfolge Standard, Pandas-Modul, CSV-Modul und Souwapy-Modul schneller ist. Das durchschnittliche Verarbeitungszeitverhältnis war für das CSV-Modul 1,4-mal schneller als für das Pandas-Modul, für das Souwapy-Modul 2,3-mal schneller als für das CSV-Modul und für das Souwapy-Modul 3,1-mal schneller als für das Pandas-Modul.
Bei näherer Betrachtung ist die Verarbeitungszeit im Standardalgorithmus proportional zum Quadrat der Anzahl der Elemente. [Es ist bekannt, dass bei der Standardmethode zum Hinzufügen von Arrays in der Reihenfolge mit dem Operator "+" die Gesamtmenge der Daten, die sich während der Verarbeitung bewegen, proportional zum Quadrat der Anzahl der Array-Elemente zunimmt](http: // qiita.com/tanaike/items/17c88c69a0aa0b8b18d7). Andererseits ist in jedem Modul die Verarbeitungszeit linear proportional zur Anzahl der Elemente. Daraus kann geschlossen werden, dass das CSV-Modul und das Pandas-Modul beim Wechsel zu CSV-Daten einer Optimierungsverarbeitung unterzogen werden. Ich habe versucht herauszufinden, welche Art von Algorithmus CSV und Pandas verwenden, um ein Array in eine CSV-Datei zu konvertieren, aber leider konnte ich es selbst nicht erreichen.
Wenn die Anzahl der Elemente gering ist, können Sie feststellen, dass zwischen den einzelnen Modulen kein großer Unterschied in der Verarbeitungszeit besteht. Der Effekt wird angezeigt, wenn die Anzahl der Elemente zunimmt. Das Souwapy-Modul hat ein schnelles Ergebnis, da es einen speziellen Algorithmus zum Konvertieren von Array-Daten in CSV-Daten verwendet. Bisher verfügt es jedoch nur über diese eine Funktion, sodass es über weitere erweiterte Funktionen verfügt. Ich dachte, es wäre schön, es mit einem Modul zu kombinieren und es nur in der endgültigen Ausgabe der CSV-Datei zu verwenden.
Das Souwapy-Modul ist ein Port der Bibliothek für GAS. Es schien effektiv zu sein, wenn die Anzahl der Elemente zunahm, also habe ich es auf PyPI hochgeladen, wenn es nützlich sein könnte. Die Installationsmethode und Verwendungsmethode sind wie folgt.
Bisher kann nur das Array summiert werden. Ich möchte es hinzufügen, wenn in Zukunft andere Funktionen benötigt werden.
--Wie installiert man
$ pip install souwapy
python
from souwapy import SOUWA
s = SOUWA.sou()
result = s.getcsvdata(array, ",", "\n")
Array ist ein Array. Bitte ändern Sie das Trennzeichen und den Zeilenvorschubcode jederzeit. Siehe unten für Details.
Recommended Posts