2016-04-27 11 views
2

Fragen, was ist die effizienteste Methode zum Lesen von Daten aus einer lokal bereitgestellten Datei mit Python.Daten aus der Dateiperformance extrahieren (Subprozess vs Datei lesen) Python

Entweder Subprozesse und nur Katze der Inhalt der Datei mit:

ssh = subprocess.Popen(['cat', dir_to_file], 
         stdout=subprocess.PIPE) 
for line in ssh.stdout: 
    print line 

oder einfach Inhalt der Datei lesen:

f = open(dir_to_file) 
data = f.readlines() 
f.close() 
for line in data: 
    print line 

ich ein Skript erschaffe, die den Inhalt lesen hat viele Dateien und ich frage mich, welche Methode ist am effizientesten in Bezug auf die CPU-Auslastung und auch die schnellste in Bezug auf die Laufzeit ist.

Dies ist meine erste Post hier bei stackoverflow, Entschuldigung für die Formatierung.

Dank

+0

Wenn Sie Zeile für Zeile möchten, müssen Sie nicht öffnen und dann lesen, können Sie direkt 'für Zeile in öffnen (dir_to_file)' – heltonbiker

+1

Meine Vermutung ist, wenn CPU-Auslastung Ihr Anliegen ist, dann spielt es mehr Bedeutung Sie tun Zeile für Zeile als das, was das Lesen macht. Sie werden von der Festplatte mit IO-Engpässen behaftet sein, bevor die CPU auf diese Beispiele verzichtet. – chrisd1100

+2

Sie haben eine Frage gestellt, die Sie nur beantworten können. Implementieren Sie beide und messen Sie sie. Niemand sonst kann Ihnen sagen, welches besser für * Ihre * Daten auf * Ihrem * Computer ist. Nachdem ich das gesagt habe, behaupte ich, dass der zweite fast garantiert schneller ist. –

Antwort

0

@ chrisd1100 ist richtig, dass Druck Zeile für Zeile der Engpass ist. Nach einem kurzen Experiment, hier ist was ich gefunden habe.

Ich habe die zwei oben genannten Methoden wiederholt (A - Subprozess, B - readline) und auf zwei verschiedene Dateigrößen (~ 100 KB und ~ 10 MB).

Versuch 1: ~ 100 KB

subprocess: 0.05 - 0.1 seconds 
readline: 0.02 - 0.026 seconds 

Versuch 2: ~ 10MB

subprocess: ~7 seconds 
readlin: ~7 seconds 

Bei der größeren Dateigröße, Druck Zeile für Zeile wird mit Abstand der teuerste Operation. Bei kleineren Dateigrößen scheint die Readline etwa 2x Geschwindigkeit zu haben. Vorläufig würde ich sagen, dass Readline schneller ist.

Diese wurden alle auf Python 2.7.10, OSX 10.11.13, 2.8 Ghz i7 ausgeführt.

+0

Große Analyse, so sieht es aus wie readline ist der Weg für kleinere Dateien und für größere Dateien der Laufzeitunterschied ist unbedeutend. Aber ich habe bemerkt, dass die CPU-Nutzung bei Verwendung von Readline beim Lesen von vielen Dateien auf> 90% ansteigt. – Prash

+0

Ich kenne derzeit keinen Weg, um die beiden Programme auf ihrer CPU-Nutzung genau zu profilieren; obwohl das scheint eine interessante Sache zu suchen, und ich hätte es gerne aufgenommen :) Aber wenn Ihre Beobachtung von 90% überzeugend genug für Sie ist, dann fahren Sie fort und verwenden Sie "subprocess". Da du daran arbeiten wirst, wenn du etwas neues findest, komm bitte zurück und aktualisiere diesen Thread. Ich wäre daran interessiert zu wissen. –