Geschwindigkeitsbewertung der Ausgabe von CSV-Dateien in Python

Hintergrund

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

Bewertungsmethoden

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.

Resultate der Auswertung

fig.png

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.

Bonus

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

Geschwindigkeitsbewertung der Ausgabe von CSV-Dateien in Python
Ausgabe in eine CSV-Datei mit Python
CSV in Python
Dateneingabe / -ausgabe in Python (CSV, JSON)
Dateioperationen in Python
Geben Sie die Anzahl der CPU-Kerne in Python aus
Dateiverarbeitung in Python
Dateimanipulation mit Python
Verschieben von CSV-Dateien in Python Teil 2: Leistungsmessung
Ausgabe in Form eines Python-Arrays
Japanische Ausgabe mit Python
Lesen Sie die Python-CSV-Datei
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
Registrieren Sie gemeinsam Daten im Firestore mithilfe der CSV-Datei in Python
Geben Sie das Ausgabeergebnis von sklearn.metrics.classification_report als CSV-Datei aus
Zusammenfassung der Python-Dateivorgänge
Objektäquivalenzbeurteilung in Python
Implementierung der schnellen Sortierung in Python
Laden Sie die CSV-Datei mit Python herunter
Lesen Sie die Fortran-Ausgabe mit Python
Vergleichen Sie die Lese- / Schreibgeschwindigkeit und Kapazität von CSV, Pickle, Joblib und Parkett in einer Python-Umgebung
Geben Sie für jede Datei die angegebene Tabelle der Oracle-Datenbank in Python in Excel aus
[Python] Öffnen Sie die CSV-Datei in dem von Pandas angegebenen Ordner
Ändern Sie das Standardausgabeziel in eine Datei in Python
[Hinweis] Import von Dateien in das übergeordnete Verzeichnis in Python
Google sucht mit Python nach der Zeichenfolge in der letzten Zeile der Datei
Verschieben von CSV-Dateien mit Python Teil 1
Bildpixel-Manipulation in Python
Manipulation des Datei- / Ordnerpfads in Python
Ausgabe 2017 Premium Friday List in Python
Einfache Verschlüsselung von Dateiinhalten (Python)
Tipps zur Eingabe / Ausgabe von Python-Dateien
[Python] Mit Python in eine CSV-Datei schreiben
Speichern Sie die Binärdatei in Python
Linebot-Erstellung und Dateifreigabe mit Python
Zeitdelta in Python 2.7-Serie teilen
MySQL-automatische Escape-Funktion von Parametern in Python
Machen Sie die Standardausgabe in Python nicht blockierend
Implementierung eines Lebensspiels in Python
Erstellen Sie eine Binärdatei in Python
Audio-Wellenform-Anzeige in Python
Lesen und Schreiben von Python CSV-Dateien
Die Geschichte des "Lochs" in der Akte
Hinweise zur Eingabe / Ausgabe von Python-Dateien
Exportieren und Ausgeben von Dateien in Python
Das Gesetz der Zahlen in Python
Implementierung der ursprünglichen Sortierung in Python
Geschwindigkeitsvergleich der Python-XML-Perspektive
ORC, Parkettdateivorgänge in Python
Reversibles Verwürfeln von Ganzzahlen in Python
Geben Sie den Inhalt von ~ .xlsx im Ordner mit Python in HTML aus
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Funktion zum Öffnen einer Datei in Python3 (Unterschied zwischen open und codecs.open und Geschwindigkeitsvergleich)
Konvertierung der Zeichenfolge <-> Datum (Datum, Datum / Uhrzeit) in Python
[Python] So konvertieren Sie eine Datenbankdatei in CSV
Verwendung der in Pip 7.1 hinzugefügten Einschränkungsdatei
Ändern Sie die Länge der Python-CSV-Zeichenfolgen
Überprüfen Sie das Verhalten des Zerstörers in Python
Übung, dies in Python zu verwenden (schlecht)