4.2
 Technisches

4.2.1
 Generatorausdrücke

Generatorausdrücke (generator expressions

Listenkomprehension: Prinzip “Liste aller Dinge, die …”

Baue die Liste aller kleingeschriebenen Wörter aus dem Brown-Korpus und erzeuge danach aus der Liste eine Menge! set([w.lower() for w in nltk.corpus.brown.words()])

Generatorausdrücke: Prinzip “Der Nächste, bitte!”

Nimm ein kleingeschriebenes Wort nach dem andern und mache es zum Element der Menge! set(w.lower() for w in nltk.corpus.brown.words())

Listenkomprehension vs. Generatorausdrücke 

Generatorausdrücke statt Listenkomprehension

Im NLTK-Buch wird aus Effizienzgründen set(w.lower() for w in text) statt set([w.lower() for w in text]) notiert.

Generatorausdrücke und die Iteratorfunktion next()

 37

>>> quadrat = (i*i for i in [10,11])
>>> quadrat
<generator object <genexpr> at 0x16a6f80>
>>> type(quadrat)
<type generator> 
>>> quadrat.next()
100 
>>> quadrat.next()
121 
>>> quadrat.next()
Traceback (most recent call last): 
 File "<stdin>", line 1, in <module> 
StopIteration

Achtung: Die Ausnahme (exception) StopIteration erscheint, wenn der Generator erschöpft ist.

Rechenzeit und Speicherverbrauch messen 
Programm mit Generatorausdrücken  38

 
import nltk, timeit, time, os 
words = nltk.corpus.brown.words() 
 
def test_generator(): 
   return set(w.lower() for w in words) 
 
# Initialize timer object 
tg = timeit.Timer(test_generator) 
 
# Perform timing 
print Timed generator (seconds):, tg.timeit(1)
Achtung: Der Speicherverbrauch muss extern gemessen werden.

Rechenzeit und Speicherverbrauch messen 
Programm mit Listencomprehension  39

 
import nltk, timeit, time, os 
words = nltk.corpus.brown.words() 
 
def test_listcomprehension(): 
   return set([w.lower() for w in words]) 
 
# Initialize timer object 
tl = timeit.Timer(test_listcomprehension) 
 
# Perform timing 
print Timed listcomprehension (seconds):, tl.timeit(1)
Achtung: Der Speicherverbrauch muss extern gemessen werden.

4.2.2
 xrange

Effizienz in Rechenzeit 
Zufällige Auswahl von Elementen aus einem Bereich  40

 
# Modul zur Zeitmessung von Python-Statements 
import timeit 
setup = import random 
 
# Konstruiere 2 Timer-Objekte 
tr = timeit.Timer(random.sample( range(1000000),100),setup) 
tx = timeit.Timer(random.sample(xrange(1000000),100),setup) 
 
# Führe Timings je einmal durch und speichere Anzahl Sekunden 
trsecs = tr.timeit(1) 
txsecs = tx.timeit(1) 
 
print "Aufgabe: Sample 100 Zahlen aus dem Bereich 0 bis 999999." 
print "Zeit mit xrange:", txsecs, "Sekunden" 
print "Zeit mit range:", trsecs, "Sekunden" 
print "xrange ist etwa", trsecs/txsecs, "Mal schneller!"

Zufälliges Auswählen von Wörtern 
Das Ziehen einer zufälligen Stichprobe (sample) aus einem Korpus.  41

 
import nltk, random 
 
corpus = nltk.corpus.nps_chat.words() 
 
# for demonstration 
for i in random.sample(xrange(len(corpus)),20): 
   print corpus[i]
 
# as a reusable function with a generator return value 
def sample_corpus1(text,size): 
   return (text[i] for i in random.sample(xrange(len(text)),size)) 
 
# as a reusable function with a list return value 
def sample_corpus2(text,size): 
   return [text[i] for i in random.sample(xrange(len(text)),size)]