Heim > Artikel > Backend-Entwicklung > In Python integrierte Quellcodeanalyse vom Typ str
Die Grundeinheit des Computerspeichers ist das Byte, das aus 8 Bits besteht. Da Englisch nur aus 26 Buchstaben plus einer Reihe von Symbolen besteht, können englische Zeichen direkt in Bytes gespeichert werden. Andere Sprachen (wie Chinesisch, Japanisch, Koreanisch usw.) müssen jedoch aufgrund der großen Anzahl von Zeichen mehrere Bytes für die Codierung verwenden.
Mit der Verbreitung der Computertechnologie entwickelt sich die Technologie zur Kodierung nicht-lateinischer Zeichen weiter, es gibt jedoch immer noch zwei wesentliche Einschränkungen:
Unterstützt keine Mehrsprachensprache: Das Kodierungsschema einer Sprache kann nicht für eine andere Sprache verwendet werden
Es gibt keinen einheitlichen Standard: Chinesisch hat beispielsweise mehrere Kodierungsstandards wie GBK, GB2312, GB18030 usw.
Da die Kodierungsmethoden nicht einheitlich sind, müssen Entwickler zwischen verschiedenen Kodierungen hin und her konvertieren , was unweigerlich zu vielen Fehlern führt. Um dieses Inkonsistenzproblem zu lösen, wurde der Unicode-Standard vorgeschlagen. Unicode organisiert und kodiert die meisten Schriftsysteme der Welt und ermöglicht es Computern, Texte auf einheitliche Weise zu verarbeiten. Unicode umfasst derzeit mehr als 140.000 Zeichen und unterstützt selbstverständlich mehrere Sprachen. (Unicodes Uni ist die Wurzel von „Vereinigung“)
Nach Python 3 wird das str-Objekt intern durch Unicode dargestellt, sodass es im Quellcode zu einem Unicode-Objekt wird. Der Vorteil der Verwendung der Unicode-Darstellung besteht darin, dass die Kernlogik des Programms Unicode einheitlich verwendet und nur auf der Eingabe- und Ausgabeebene dekodiert und kodiert werden muss, wodurch verschiedene Kodierungsprobleme weitestgehend vermieden werden können.
Das Diagramm sieht wie folgt aus:
Problem: Da Unicode mehr als 140.000 Zeichen enthält, benötigt jedes Zeichen mindestens 4 Bytes zum Speichern (dies sollte daran liegen, dass ein Abschnitt mit 2 Zeichen nicht ausreicht). , es werden also 4 Bytes anstelle von 3 Bytes verwendet.) Der ASCII-Code für englische Zeichen erfordert nur 1 Byte. Durch die Verwendung von Unicode vervierfachen sich die Kosten für häufig verwendete englische Zeichen.
Werfen wir zunächst einen Blick auf die Größenunterschiede verschiedener Formen von Str-Objekten in Python:
>>> sys.getsizeof('ab') - sys.getsizeof('a') 1 >>> sys.getsizeof('一二') - sys.getsizeof('一') 2 >>> sys.getsizeof('????????') - sys.getsizeof('????') 4
Man erkennt, dass Python Unicode-Objekte intern optimiert: Basierend auf dem Textinhalt wird die zugrunde liegende Speichereinheit ausgewählt.
Der zugrunde liegende Speicher von Unicode-Objekten ist entsprechend dem Unicode-Codepunktbereich der Textzeichen in drei Kategorien unterteilt:
PyUnicode_1BYTE_KIND: Alle Zeichencodepunkte liegen zwischen U+0000 und U+00FF
PyUnicode_2BYTE_KIND: Alle Zeichencodepunkte liegen zwischen U+0000 und U+FFFF, und der Codepunkt mindestens eines Zeichens ist größer als U+00FF
PyUnicode_1BYTE_KIND: Alle Zeichencodepunkte liegen zwischen U+0000 und U+10FFFF, und es gibt at Codepunkt mindestens eines Zeichens größer als U+FFFF
Die entsprechende Aufzählung lautet wie folgt:
enum PyUnicode_Kind { /* String contains only wstr byte characters. This is only possible when the string was created with a legacy API and _PyUnicode_Ready() has not been called yet. */ PyUnicode_WCHAR_KIND = 0, /* Return values of the PyUnicode_KIND() macro: */ PyUnicode_1BYTE_KIND = 1, PyUnicode_2BYTE_KIND = 2, PyUnicode_4BYTE_KIND = 4 };
Wählen Sie je nach Klassifizierung unterschiedliche Speichereinheiten aus:
/* Py_UCS4 and Py_UCS2 are typedefs for the respective unicode representations. */ typedef uint32_t Py_UCS4; typedef uint16_t Py_UCS2; typedef uint8_t Py_UCS1;
Die entsprechende Beziehung lautet wie folgt:
Text Typ | Zeichenspeichereinheit | Größe der Zeichenspeichereinheit (Byte) |
---|---|---|
PyUnicode_1BYTE_KIND | Py_UCS1 | 1 |
PyUnicode_2BYTE_KIND | Py_UCS 2 | 2 |
PyUnicode_4BYTE_KIND | Py_UCS4 | 4 |
Aufgrund der internen Speicherstruktur von Unicode variieren Texttypen, daher muss die Typart als öffentliches Unicode-Objektfeld gespeichert werden. Python definiert intern einige Flag-Bits als öffentliche Unicode-Felder: (Aufgrund der begrenzten Ebene des Autors werden alle Felder hier nicht im folgenden Inhalt vorgestellt. Sie können später selbst mehr darüber erfahren. Halten Sie Ihre Faust ~)
intern: ob es sich um eine internierte Mechanismuswartung handelt
Art: Typ, der zur Unterscheidung der Größe der zugrunde liegenden Zeichenspeichereinheit verwendet wird
kompakt: Speicherzuweisungsmethode, ob Objekt und Textpuffer getrennt sind
asscii: ob der Text ausschließlich reines ASCII ist
Verwenden Sie die Funktion PyUnicode_New, um das Unicode-Objekt entsprechend der Anzahl der Textzeichen und der maximalen Zeichengröße maxchar zu initialisieren. Diese Funktion wählt hauptsächlich die kompakteste Zeichenspeichereinheit und zugrunde liegende Struktur für Unicode-Objekte basierend auf maxchar aus: (Der Quellcode ist relativ lang und wird daher hier nicht aufgeführt. Sie können ihn selbst verstehen. Er wird unten in Tabellenform angezeigt )
maxchar 128 256 | ||||
---|---|---|---|---|
PyUnicode_1BYTE_KIND | PyUnicode_2BYTE_KIND | PyUnicode_4BYTE_KIND | ascii | |
0 | 0 | 0 | Größe der Zeichenspeichereinheit (Bytes) | |
1 | 2 | 4 | Untere Struktur | |
PyCompactUnicodeObject | PyCompactUnicodeObject | PyCompactUnicodeObject |
Das obige ist der detaillierte Inhalt vonIn Python integrierte Quellcodeanalyse vom Typ str. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!