BlackJack hat geschrieben:@albertus: Kein Ahnung was schneller ist. Ich weiss aber dass Deine Methode deutlich umständlicher ausgedrückt ist als ein einfaches ``list(datei)`` oder ``datei.readlines()``. In wie weit dabei wirklich zeilenweise eingelesen wird, ist dann übrigens eine Implementierungsfrage. Ohne zu *wissen* das es *deutlich* schneller ist, sollte man das IMHO nicht so umständlich schreiben.
Dann probieren wir es doch einfach mal aus:
Code: Alles auswählen
#!/usr/bin/python
import profile
def start():
f = open("/home/albert/foo.txt", "w")
abc = "abcdefghijklmnopqrstuvwxyz"
for i1 in abc:
for i2 in abc:
for i3 in abc:
for i4 in abc:
f.write(i1+i2+i3+i4+"\n")
f.close()
def test1():
datei = open("/home/albert/foo.txt")
a = set(s.rstrip() for s in datei)
def test2():
string = open("/home/albert/foo.txt").read()
a = set(string.splitlines())
#start()
profile.run("test1()")
profile.run("test2()")
Ergebnis bei mir:
Für Test 1
913958 function calls in 7.942 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 :0(open)
456976 1.903 0.000 1.903 0.000 :0(rstrip)
1 0.001 0.001 0.001 0.001 :0(setprofile)
1 0.051 0.051 7.941 7.941 <string>:1(<module>)
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 7.942 7.942 profile:0(test1())
1 2.059 2.059 7.890 7.890 rutsch.py:18(test1)
456977 3.928 0.000 5.831 0.000 rutsch.py:20(<genexpr>)
Für Test 2
7 function calls in 0.292 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 :0(open)
1 0.004 0.004 0.004 0.004 :0(read)
1 0.001 0.001 0.001 0.001 :0(setprofile)
1 0.060 0.060 0.060 0.060 :0(splitlines)
1 0.051 0.051 0.291 0.291 <string>:1(<module>)
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 0.292 0.292 profile:0(test2())
1 0.176 0.176 0.240 0.240 rutsch.py:23(test2)
Ich denke die Zahlen sind Aussagefähig genug. Aber ich gebe euch allen Recht meine Methode ist sehr Speicher intensiv. Ich selber würde sie auch nur anwenden wenn zwei Bedingungen erfühlt sind:
1. Beim Start des Programms um Wartezeiten zu vermeiden
2. Wenn ich die Datei nur einmal einlesen muss
Eines möchte ich noch Anmerken: Die Liste die ich zusätzlich erzeuge hat nur für eine kurze Zeit bestand.
Mit freundlichen Grüßen
Albertus