List Comprehensions - Fortschritt oder Hemmschuh?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 29. Mai 2003, 14:05

Hallo,

ich hab mir mal gedanken gemacht, was die "List Comprehensions" in Python 2.2 eigentlich bringen, sie sollen ja map und filter ersetzen. Naja, testet mal selbst.

Code: Alles auswählen

#!/usr/bin/env python

from time import clock

max = 200000

liste = range(ord("a"),ord("z")+1)

def forloop(n, f):
    for i in xrange(n):
        tmp = f()

print "Teste map()"
print "map(chr, liste)"
a = clock()
forloop(max, lambda : (map(chr, liste)) )
   
b = clock()
lzm = b-a
print "Laufzeit = %.3f\n" % lzm
print "Teste for"
print "([chr(x) for x in liste])"
a = clock()
forloop(max, lambda : ([chr(x) for x in liste]) )
   
b = clock()
lzl = b-a
print "Laufzeit = %.3f\n" % lzl

if lzl > lzm:
    print "Ein map(chr, liste) ist %.2f mal schneller als ein [ chr(x) for x in liste]" % (lzl/lzm)
else:
    print "Ein [ chr(x) for x in liste] ist %.2f mal schneller als ein map(chr, liste)" % (lzm/lzl)
print
Interessantes Ergebnis oder nicht?

Gruß

Dookie
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 29. Mai 2003, 14:36

Hallo nochmal,

ich habe noch etwas weiter geforscht, bei ganz einfachen funktionen, wie x*x oder x*3 sind "List Comprehensions" etwas schneller als map(). Sobald aber eine richtige Funktion über die Liste angewendet werden soll, ist map deutlich schneller. Auch wenn man ein lambda wie "lambda x: x*x" verwendet zieht map wieder davon.


Gruß

Dookie
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Donnerstag 29. Mai 2003, 14:55

Dann musst du ja auch noch beachten, dass du mit List Comprehensions auch noch filter ersetzen kannst, und zwar allein schon 1,5 mal so schnell. Wenn du dann das gefilterte Ergebniss quadrieren willst hast du die wahl zwischen den beiden Sachen:

Code: Alles auswählen

list=range(10)
map(lambda x:x**2,filter(lambda x:x%2, liste))
[x**2 for x in liste if x%2]
Die List Comprehension ist hier insgesamt 2 mal so schnell, wie die zwei verschachtelten Funktionen. Für nicht zu filternde Sachen empfiehlt sich also map, und anstelle von filter nimmt man lieber eine Comprehension. Das ist eine Logik :lol: .
Antworten