925
32.10
Lösungen
Beispieldialog:
Hinweis: Die String-Methode count() liefert die Anzahl der Vorkommen eines Strings.
Beispiel:
Aufgabe 2
Eine Primzahl ist eine Zahl, die nur durch 1 und durch sich selbst teilbar ist. Für die Ver-
schlüsselungstechnik werden große Primzahlen gesucht. Entwickeln Sie ein Programm,
das mit einem Pool von Arbeitsprozessen einige 14-stellige Primzahlen findet und den Zeit-
aufwand dokumentiert. Beispielausgabe:
Gehen Sie folgendermaßen vor:
Definieren Sie eine Funktion, die über Probedivisionen prüft, ob eine natürliche Zahl
Primzahl ist. Dabei wird die Modulo-Operation
% verwendet. Eine Zahl n ist genau dann
durch
m teilbar, wenn n % m == 0 gilt. Diese Funktion liefert True, wenn die übergebene
Zahl Primzahl ist, und sonst
False.
Im Hauptprogramm wird eine Liste mit 200 14-stelligen Zufallszahlen erzeugt.
Ein Pool von nebenläufigen Arbeitsprozessen bearbeitet mithilfe der Methode map()
diese Liste und prüft für jede Zahl, ob sie eine Primzahl ist oder nicht. Es entsteht eine
boolesche Liste mit 200 Wahrheitswerten.
Mithilfe dieser beiden Listen werden die gefundenen Primzahlen ermittelt und ausge-
geben.
32.10 Lösungen
Lösung 1
Der lange Text wird in vier gleich große Teile zerlegt. Dann werden vier Prozesse erzeugt,
die jeweils einen Teil des Textes bearbeiten und die Vorkommen des Suchwortes ermitteln.
Suchbegriff: house
Das Wort 'house' kommt 2620 Mal in Mark Twains Werk vor.
>>> "Banane".count("a")
2
Gefundene Primzahlen:
22579830207709
37510543904287
32605445007229
78943865027147
83975368514483
Bearbeitungszeit: 19.552688 Sekunden
Kapitel 32
Parallele Datenverarbeitung
926
Die ermittelte Anzahl hängen sie an die Queue an. Der Hauptprozess liest die Zahlen aus
der Queue und bildet die Summe.
Skript:
Erläuterung:
#1: Hier wird gezählt, wie häufig das kleingeschriebene Suchwort im kleingeschriebenen
Textfragment vorkommt.
#2: Die ermittelte Anzahl wird dann an die Queue gehängt.
#3: Der Benutzer gibt einen Suchbegriff ein.
#4: Die Textdatei mit sämtlichen Werken Mark Twains wird geöffnet. Eine Kopie des Textes
befindet sich im Projektordner.
#5: Der Text wird in vier gleiche Stücke zerlegt. Genauer: Es wird eine Liste aus vier Strings
erzeugt, die zusammen den Text ergeben.
#6: Hier wird eine Liste von vier Prozessen erzeugt. Jeder Prozess soll die Funktion
search() auf ein Stück des Gesamttextes anwenden.
from multiprocessing import Process, Queue
def search(q, text, word):
n = text.lower().count(word.lower()) #1
q.put(n) #2
if __name__ == '__main__':
word = input("Suchbegriff: ") #3
f = open("marktwain.txt") #4
text = f.read()
f.close()
q = Queue()
n = len(text)
chunks = [text[:n//4], text[n//4:n//2],
text[n//2:3*n//4], text[3*n//4:]] #5
processes = [Process(target=search, args=(q, chunk, word))
for chunk in chunks] #6
for p in processes: p.start()
n = 0
for i in range(4): n += q.get() #7
for p in processes: p.join()
print("Das Wort '%s' kommt %i Mal in Mark Twains Werk vor."
% (word, n)) #8
927
32.10
Lösungen
#7: Die Werte, die sich in der Queue angesammelt haben (Vorkommenshäufigkeiten des
Wortes
w in den vier Teilstücken des Textes), werden zusammengezählt.
#8: Ausgabe des Ergebnisses als lesbarer Text. Hier wird ein Formatstring mit zwei Platzhal-
tern
%s und %i verwendet. Die Platzhalter werden durch word und n ersetzt.
Lösung 2
Skript:
Erläuterung:
#1: Mit allen natürlichen Zahlen i zwischen 2 und der nach oben gerundeten Wurzel aus n
werden Probedivisionen durchgeführt.
#2: Die Modulo-Operation % liefert den Rest einer ganzzahligen Division. Falls die Division
durch
i ohne Rest aufgeht, ist die Zahl n keine Primzahl. Die Ausführung der Funktion wird
abgebrochen und es wird
False zurückgegeben.
from multiprocessing import Pool
from random import randint
from time import time
from math import ceil, sqrt
def prime(n):
""" Prüft, ob die Zahl n eine Primzahl ist """
for i in range(2, ceil(sqrt(n))): #1
if n%i == 0:
return False #2
return True #3
if __name__ == '__main__':
N = 200 # Anzahl der Zufallszahlen
big_numbers = [randint(10**13, 10**14)
for i in range(N)] #4
start = time() #5
p = Pool() #6
result = p.map(prime, big_numbers) #7
p.close() #8
p.join() #9
seconds = time() – start #10
primes = [big_numbers[i]
for i in range(N) if result[i]] #11
print("Gefundene Primzahlen:")
for pr in primes:
print(pr)
print("Bearbeitungszeit: %f Sekunden" % seconds) #12

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.