Suche nach bestimmten Buchstaben in einer Textdatei

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.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

bwbg hat geschrieben:Wobei die Zeilen auch irgendwo her kommen müssen. Aber das ist für die Problemlösung irrelevant. Die Performancefrage wurde gar nicht gestellt.
Die Zeit um im Speicher nach Zeichen zu suchen dürfte, im Vergleich zum Datei öffnen und einlesen wohl irrerelevant sein.

Wenn wir allerdings nach der Performace für bereits im Speicher befindliche Zeilen fragen, ist sicher für einen Buchstaben das die performanteste Lösung:

if line.find("G" ):

Hier werden Strings übergeben und eine Umwandlung der Strings in etwas anderes erübrigt sich. Es kann gleich mit dem Suchen begonnen werden, und zwar zuerst nach dem ersten Zeichen des übergebenen Parameters, wären weitere da, würden dann auch die nächsten Zeichen verglichen. Das aber erübrigt sich und fertig.

Die am wenigstens performante Lösung, wenn wir einmal regex nicht berücksichtigen, wäre bei einem Zeichen:

Code: Alles auswählen

if set("G").intersection(line):
Hier wird zuerst der String line in ein set Objekt umgewandelt, bevor überhaupt mit dem Suchen begonnen wird. Diese Umwandlung kostet ein mehrfaches an Zeit, als das Suchen.

Schwer abschätzbar ist die Performance von:

Code: Alles auswählen

if 'G' in line:
Ist in inteligent implementiert und wenn es erkennt, dass es sich um eine Suche in einem String handelt, könnte es performant ähnlich wie find sein. Wandelt es aber auch zuvor erst den String um, dann kann die Performance ählich wie bei set.intersection liegen.

Bei drei Zeichen allerdings ist die Frage, wieviel Zeit kosten drei Funktionsaufrufe mit konstanten, bzw. referenzierten Parametern in Python im Vergleich zum einmaligen Funktionsaufruf mit:

if set("FGM").intersection(line):

Da bin ich überfragt. Ab einer gewissen Anzahl zu suchender Zeichen ist set.intersection sowohl schneller als dreimaliges find wie auch angebracht.

Bei drei Zeichen sieht das noch gut aus und ist sicher für einen Programmieranfänger leicht verständlich:

if 'F' in line or 'G' in line or 'M' in line:

Wie das jetzt mit der Performance sein wird, schwer zu sagen, aber in diesem Fall wie gesagt, gemessen am Datei öffnen und einlesen und wohl auch wieder schreiben, wohl irrelevant.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: beim Programmieren interessiert erstmal die Performance überhaupt nicht, sondern nur die Verständlichkeit. Um zu Prüfen ob ein String *in* einem anderen vorkommt, ist der in-Operator das offensichtlichste (und nebenbei bemerkt auch noch das performanteste). Auf Sets wird niemand als erstes kommen.
BlackJack

@Alfons Mittelmeyer: Das bei der `intersection()`-Lösung `line` in ein `set` umgewandelt wird ist nicht erforderlich und wird in CPython AFAIK auch nicht gemacht.

Der ``in``-Operator ist IMHO leicht abschätzbar weil der in CPython bei `str` überladen ist, also ähnlich performat sein sollte wie `find()`, bei dem aber neben dem Suchen noch der Methodenaufruf dazu kommt.
Antworten