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:
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:
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.