String auslesen und multiplizieren

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.
Antworten
proforma2
User
Beiträge: 6
Registriert: Mittwoch 20. August 2008, 15:10

Mittwoch 20. August 2008, 15:28

Hallo!
Ich bin total unbedarft, was Python bzw. Programmierung überhaupt angeht (ich studiere Linguistik, allerdings ohne computationellen Schwerpunkt und hab deshalb nicht den Hauch von Ahnung).

Ich hab nun folgendes Problem:
Für eine Untersuchung bezüglich des Speicherbedarfs und der Verarbeitungsgeschwindigkeit der unterschiedlichen Unicode-Kodierungsformate (UTF-8, -16 und -32) versuche ich ein Programm zu schreiben, das mir
1. einen 100-stelligen String (heißt das so?, auf jeden Fall sind es 100 Zeichen in UTF-8 bzw. -16 bzw. -32, ohne Leerstellen, in einer einzigen Zeile) aus einer vorhandenen Textdatei einliest und
2. diese eingelesenen Daten (den String?) dann 1000 mal in eine neue Datei mit derselben Kodierung schreibt, getrennt jeweils durch einen Zeilensprung, also Zeile 1: 100 Zeichen, Zeile 2: dieselben 100 Zeichen etc.
Zu guter Letzt wär's prima, wenn mir dieses Programm dann
3. die Verarbeitungszeit dieser Aufgabe in die 'Shell', also in dieses andere Fenster schreiben würde.

Ich wäre wirklich sehr dankbar, wenn mir irgendjemand bei diesem Problem helfen könnte - vielen Dank schon mal!!!

Grüße,
proforma2
lunar

Mittwoch 20. August 2008, 16:00

Für das Lesen und Schreiben gibt es "open()", für den Umgang mit Encodings "str.decode()", "str.encode()" und "codecs" und für Zeitmessungen "timeit". Die Grundlagen von Python verrät dir das Tutorial.

Allerdings misst du mit dem beschriebenen Vorgehen nur den IO-Durchsatz deiner Festplatte und die Geschwindigkeit der Caches des Betriebssystem.
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Mittwoch 20. August 2008, 16:47

könnte man das ganze dann nicht noch mit time aufrufen? oder wäre das dann keine richtige Zeitausgabe?

Code: Alles auswählen

time programm.py
oder so ähnlich
lunar

Mittwoch 20. August 2008, 16:54

würmchen hat geschrieben:könnte man das ganze dann nicht noch mit time aufrufen?
Man misst halt alles mit, u.a. z.B. den Aufruf des Linkers, das Laden des Interpreters, das Laden der Module, etc. Um etwas bestimmtest zu analysieren, sind das ein bisschen viele Störfaktoren.
oder wäre das dann keine richtige Zeitausgabe?
Zumindest unzuverlässiger als ein "timeit"-Resultat mit mehrerer Iterationen und Wiederholungen.
proforma2
User
Beiträge: 6
Registriert: Mittwoch 20. August 2008, 15:10

Mittwoch 20. August 2008, 17:04

@ lunar:
Danke für die Antwort; die Textdateien sollen allerdings nicht irgendwie umcodiert werden, d.h. sie kommen als UTF-8 rein und gehen als UTF-8 raus, bzw. -16 bzw. -32.
Was passieren sollte, ist, dass 100 Zeichen, die in der Textdatei stehen (ohne Leerzeichen und Zeilenumbruch) eingelesen werden und in einer neuen Textdatei mit derselben Kodierung 1000 mal wiederholt geschrieben werden, mit Zeilenumbruch nach jeder Wiederholung.
Geht sowas irgendwie mit 'Iteration'? Falls ja, wie geb ich dem dann diese 100 Zeichen als Argument?
Gottohgott, hab ich keine Ahnung, is ja peinlich...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 20. August 2008, 17:13

Naja, Datei einlesen und sich den Inhalt merken. Neue Datei öffnen (zum Schreiben), mit einer Schleife x mal die Daten da reinschreiben, Datei schließen, fertig.

Allerdings frage ich mich, worin der Erkenntnisgewinn liegen soll? Wie Lunar schon sagte, hat das ja viel mit der Hardware bzw. dem OS zu tun, und weniger mit Python.
proforma2
User
Beiträge: 6
Registriert: Mittwoch 20. August 2008, 15:10

Mittwoch 20. August 2008, 17:30

@ Hyperion:
Danke auch dir. Genau um dieses 'Inhalt merken, mit einer Schleife x mal die Daten da reinschreiben' geht's mir - wie funktioniert das konkret, d.h. wie 'sag' ich dem Programm, welche Daten es einlesen soll?
Der Erkenntnisgewinn hierbei ist, zugegeben wahrscheinlich nur für mich, einen Vergleichswert zu erhalten, wie groß die Outputdateien werden und wie lange mein Rechner braucht, um das zu errechnen.
Hierbei entsteht natürlich nur ein relativer Vergleichswert und kein absoluter, da es ja von meinem Rechner etc. abhängt, wie schnell das vonstatten geht; mir geht es aber eben um diese relativen Vergleichswerte.
Ziel des Spiels ist, dass ich für mich (und nur für mich, das ist keine Hausaufgabe oder ähnliches) die Speicherbedarfs- und Verarbeitungsunterschiede zwischen UTF-8, -16 und -32 deutlich machen möchte, besonders im Hinblick auf Zeichen, die nicht mehr auf der 'Basic Multilingual Plane' von Unicode (wie 'Basic Latin' und viele andere), sondern auf der 'Supplementary Multilingual Plane' liegen, wie Gotisch etc.
lunar

Mittwoch 20. August 2008, 17:42

proforma2 hat geschrieben:Ziel des Spiels ist, dass ich für mich (und nur für mich, das ist keine Hausaufgabe oder ähnliches) die Speicherbedarfs- und Verarbeitungsunterschiede zwischen UTF-8, -16 und -32 deutlich machen möchte.
Da könntest du genauso gut Bilddateien lesen und schreiben, das hätte genauso viel Aussagekraft. Python liest und schreibt Bytes. Mit Encodings hat das überhaupt nichts zu tun, Python kennt das Encoding der Eingabedatei nicht mal.
proforma2
User
Beiträge: 6
Registriert: Mittwoch 20. August 2008, 15:10

Mittwoch 20. August 2008, 17:50

@lunar:
aber die Ausgangsdateien haben doch schon unterschiedlichen Speicherbedarf: in UTF-8 den geringsten, in UTF-32 den höchsten; in UTF-16 liegt die Größe aufgrund der Speicherform (oder wie man das nennt) innerhalb der BMP ja genau dazwischen, was ja auch logisch ist, aber dann gibt es eben diesen Sprung von der BMP zur SMP, wobei der Speicherbedarf erhöht wird (verdoppelt) - genau um den geht's mir.
Durch die Multiplikation bzw. durch das wiederholte Schreiben will ich den Unterschied nur deutlicher machen und eben herausfinden, ob mein Rechner für beispielsweise UTF-8 länger braucht als für UTF-32, um an sich die gleiche Operation auszuführen, eben nur in unterschiedlichen Kodierungsformaten.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 20. August 2008, 18:13

Ist der Unterschied nicht einfach der, dass es bei utf-16 usw einfach mehr Bytes für ein Zeichen sind als bei utf-8? (Bei utf-8 ist es doch auch dynamisch, oder? Also manche Zeichen belegen ein Byte, andere drei usw?)

Insofern wäre es doch einfach klar, dass das Schreiben von doppelt so viel Bytes einfach länger dauert, im Idealfall doppelt so lange. Nur die Messung dürfte schwer werden, da das Öffnen / Schließen von Datein ja Zeit kostet und je nach OS ja auch erst fürs physische Schreiben genutzt wird!

Mal das Grundgerüst für Dein Problem:

Code: Alles auswählen

input_line = open("input_text.txt", "r").read()
out_file = open("output_text.txt", "w")
for dummy in xrange(1000):
    out_file.write(input_line)
    out_file.write("\n")
out_file.close()
Quick and dirty und ungetestet. Exception Handling fehlt komplett usw.
proforma2
User
Beiträge: 6
Registriert: Mittwoch 20. August 2008, 15:10

Mittwoch 20. August 2008, 18:35

@Hyperion:
Vielen Dank!
Ganz genau, das ist das was ich meine (nicht das Programm, das kann ich momentan leider nicht ausprobieren, da ich nicht an nem privaten Rechner sitze und hier kein Python drauf ist, mach ich aber so bald wie möglich!) - UTF-16 = doppelt soviel Speicherplatz wie UTF-8; das, zumindest für mich, interessante ist hier allerdings, dass sich UTF-16 meines Wissens nach nicht immer so verhält: auf eben dieser 'Basic Multilingual Plane', wo die Standardzeichensätze liegen, erfolgt die Zeichenkodierung so, dass genauso viel Speicherplatz benötigt wird wie bei UTF-8, und nur wenn man diese Ebene verlässt und auf die 'Supplementary Multilingual Plane' kommt, wo eben Zeichensätze wie Etruskisch oder Gotisch liegen, also Sätze, die erheblich seltener benötigt werden, verdoppelt sich der Speicherbedarf.
Das möchte ich mir mithilfe des Programms anhand von Zahlen verdeutlichen, das ist alles.
('tschuldige, dass ich so unprofessionell schreibe, aber ich hab einfach keine Ahnung...)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 20. August 2008, 18:36

Noch dazu verwendet man bei Python vorzugsweise Unicode-Strings (vor allem ab Python 3.0), die sind dann sowieso intern in UCS-2 oder UCS-4, je nachdem wie man es kompiliert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Mittwoch 20. August 2008, 20:13

@proforma2: Nach Deiner Beschreibung willst Du also *doch* umkodieren. Du solltest aber wirklich erst einmal das Tutorial aus der Dokumentation durcharbeiten, da werden so grundlegende Dinge wie Umgang mit Dateien und Schleifen erklärt. Und dann im Wiki den Artikel [wiki]Von Umlauten, Unicode und Encodings[/wiki]
proforma2
User
Beiträge: 6
Registriert: Mittwoch 20. August 2008, 15:10

Donnerstag 21. August 2008, 07:55

@Hyperion:
Das Programm funktioniert bestens - vielen Dank nochmal!

@alle:
Dankeschön auch euch für die Hinweise und Ratschläge!
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Donnerstag 21. August 2008, 08:20

proforma2 hat geschrieben:@lunar:
aber die Ausgangsdateien haben doch schon unterschiedlichen Speicherbedarf: in UTF-8 den geringsten, in UTF-32 den höchsten; in UTF-16 liegt die Größe aufgrund der Speicherform (oder wie man das nennt)
Das ist so uneingeschränkt nur für westliche Sprachen gültig. Bei anderen Sprachen z.B. chinesisch ist UTF-16 meist kleiner als UTF-8
Antworten