2012-04-05 9 views
0

Ich habe Beispiel:Wie schnell Array aus großer Datei erstellen?

for line in IN.readlines(): 
     line = line.rstrip('\n') 
     mas = line.split('\t') 
     row = (int(mas[0]), int(mas[1]), mas[2], mas[3], mas[4]) 
     self.inetnums.append(row) 
    IN.close() 

Wenn ffilesize == 120MB, Skript Zeit = 10 sec. Kann ich diese Zeit verringern?

+3

Sie lesen eine 120-GB-Datei in den Speicher? Wie viel Speicher hat Ihre Maschine? – interjay

+1

Welche Festplatte hat 12 GB/Sek.? –

Antwort

2

können Sie einige Geschwindigkeit gewinnen, wenn Sie eine Liste Auffassungs verwenden

inetnums=[(int(x) for x in line.rstrip('\n').split('\t')) for line in fin] 

Hier ist die Profilinformationen mit zwei verschiedenen Versionen

>>> def foo2(): 
    fin.seek(0) 
    inetnums=[] 
    for line in fin: 
     line = line.rstrip('\n') 
     mas = line.split('\t') 
     row = (int(mas[0]), int(mas[1]), mas[2], mas[3]) 
     inetnums.append(row) 


>>> def foo1(): 
    fin.seek(0) 
    inetnums=[[int(x) for x in line.rstrip('\n').split('\t')] for line in fin] 

>>> cProfile.run("foo1()") 
     444 function calls in 0.004 CPU seconds 

    Ordered by: standard name 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     1 0.003 0.003 0.004 0.004 <pyshell#362>:1(foo1) 
     1 0.000 0.000 0.004 0.004 <string>:1(<module>) 
     1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 
     220 0.000 0.000 0.000 0.000 {method 'rstrip' of 'str' objects} 
     1 0.000 0.000 0.000 0.000 {method 'seek' of 'file' objects} 
     220 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects} 


>>> cProfile.run("foo2()") 
     664 function calls in 0.006 CPU seconds 

    Ordered by: standard name 

    ncalls tottime percall cumtime percall filename:lineno(function) 
     1 0.005 0.005 0.006 0.006 <pyshell#360>:1(foo2) 
     1 0.000 0.000 0.006 0.006 <string>:1(<module>) 
     220 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} 
     1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} 
     220 0.001 0.000 0.001 0.000 {method 'rstrip' of 'str' objects} 
     1 0.000 0.000 0.000 0.000 {method 'seek' of 'file' objects} 
     220 0.001 0.000 0.001 0.000 {method 'split' of 'str' objects} 


>>> 
+0

Würdest du tatsächlich etwas schneller werden, wenn du List Comps verwendest, abgesehen von der Geschwindigkeit, die du durch das Entfernen von "readlines" gewonnen hast? Es scheint mir, als wäre es nur eine andere Art, denselben Code zu schreiben. – jamylak

+0

@jamylak: Berücksichtigen Sie die Tatsache, dass Sie in einer Schleife nicht mehrmals anhängen werden. Ich habe meine Antwort mit Informationen von cProfile aktualisiert. – Abhijit

4

Entfernen der readlines()

Just do

for line in IN: 

readlines Verwenden Sie eine Liste aller Zeilen aus der Datei erstellen und dann jeden Zugriff, die Sie brauchen nicht zu tun. Ohne es verwendet die for-Schleife einfach den Generator, der jedes Mal eine Zeile aus der Datei zurückgibt.