Python - Zeichenersetzung



  • Ich muss unter Windows als Teil eines größeren Python-Programms

    Zeichen in einer großen CSV-Datei ersetzen. Konkret muss ich alle Kommas durch Strichpunkte ersetzen.

    Im Moment mache ich das in der Art:

    with open(input) as source:
      with open(output) as sink:
        for line in source:
          sink.write(line.replace(',',';')
    

    Das ganze ist aber sehr langsam, wobei ich noch kein Profiling gestartet habe.
    Unter Linux geht das ganze mit sed sehr viel schneller.

    Nun also meine Frage:
    Wie kann ich das Problem effizienter lösen?

    Ich vermute einfach mal, dass das zeilenweise Arbeiten viellciht nicht optimal ist und ein größerer Puffer besser wäre?



  • Schlange schrieb:

    Unter Linux geht das ganze mit sed sehr viel schneller.

    Unter Windows geht das ganze ganz bestimmt mit C oder C# schneller? 😉

    Unter Assembler gingen logische Operationen mit SSE-Registern ganz gut, einfacher einfach ohne SSE, in Python empfehlen sich abgesehen davon Regular Expressions
    https://docs.python.org/2/library/re.html



  • Wie wäre es alles einfach in einem rutsch zu machen?

    with open(input) as src:
      with open(output) as trg:
        trg.write(trg.read().replace(',',';'))
    

    bzw. direkt os.open, os.write, etc. verwenden, uU ist das noch einen Tick schneller.

    PS:
    regex sind hier die falsche Antwort



  • Wie würde ich das denn effizient mit C++ (eventuell auch mit Qt) machen?

    Ich würde auf jeden Fall eine funktionierende Lösung schaffen, aber ich interessiere mich mal für ein Snippet, mit dem mir gezeigt wird, wie ich das ganze schnell erledige.

    Ich gehe dabei davon aus, dass die Datei zu groß für den Hauptspeicher ist und ich den Text nicht komplett einlesen kann.



  • Desto weniger Ebenen du zwischen dem System und deinem Programm hast, desto schneller geht es. Wenn die Datei zu groß ist, dann in schönen großen Blöcken lesen.

    sed ist aber vermutlich schon sehr sehr nahe an der optimalen Performance dran.
    sed gibt es übrigens auch für Windows: http://gnuwin32.sourceforge.net/packages/sed.htm

    PS:
    uU ist auch mmap eine Option: https://docs.python.org/2/library/mmap.html


Log in to reply