Inhaltsverzeichnis
YAML
Leistung
Kimchi
JSON
Sicherheit
Andere Formate
Protokollpuffer
Nachrichtenpaket
CBOR
Wie wählt man aus?
Speichern Sie automatisch den lokalen Status von Python-Programmen
Profil
Web-API
Großflächige Kommunikation mit hoher Kapazität und geringer Latenz
Fazit
Heim Backend-Entwicklung Python-Tutorial Serialisierung und Deserialisierung von Python-Objekten: Teil 2

Serialisierung und Deserialisierung von Python-Objekten: Teil 2

Sep 03, 2023 pm 08:33 PM

Python 对象序列化和反序列化:第 2 部分

Dies ist der zweite Teil eines Tutorials zum Serialisieren und Deserialisieren von Python-Objekten. Im ersten Teil haben Sie die Grundlagen erlernt und sich dann in die Details von Pickle und JSON vertieft.

In diesem Teil erkunden Sie YAML (stellen Sie sicher, dass Sie das laufende Beispiel aus Teil eins haben), besprechen Leistungs- und Sicherheitsüberlegungen, lernen andere Serialisierungsformate kennen und erfahren schließlich, wie Sie das richtige auswählen. p>

YAML

YAML ist mein Lieblingsformat. Es handelt sich um ein benutzerfreundliches Datenserialisierungsformat. Im Gegensatz zu Pickle und JSON ist es nicht Teil der Python-Standardbibliothek, daher müssen Sie es installieren:

pip 安装 yaml

Das

yaml-Modul verfügt nur über load()dump()函数。默认情况下,它们使用像 loads()dumps() solcher Zeichenfolgen, kann aber ein zweites Argument annehmen, bei dem es sich um einen offenen Stream handelt, der dann in eine/aus einer Datei gedumpt/geladen werden kann.

import yaml



print yaml.dump(simple)



boolean: true

int_list: [1, 2, 3]

none: null

number: 3.44

text: string
Nach dem Login kopieren

Bitte beachten Sie, wie lesbar YAML im Vergleich zu Pickle oder sogar JSON ist. Jetzt kommt der coole Teil von YAML: Es versteht Python-Objekte! Es sind keine benutzerdefinierten Encoder und Decoder erforderlich. Hier ist eine komplexe Serialisierung/Deserialisierung mit YAML:

> serialized = yaml.dump(complex)

> print serialized



a: !!python/object:__main__.A

  simple:

    boolean: true

    int_list: [1, 2, 3]

    none: null

    number: 3.44

    text: string

when: 2016-03-07 00:00:00



> deserialized = yaml.load(serialized)

> deserialized == complex

True
Nach dem Login kopieren

Wie Sie sehen, verfügt YAML über eine eigene Notation zum Beschriften von Python-Objekten. Die Ausgabe ist immer noch sehr gut lesbar. Datetime-Objekte erfordern kein spezielles Markup, da YAML Datetime-Objekte von Natur aus unterstützt.

Leistung

Bevor Sie über Leistung nachdenken, müssen Sie überlegen, ob Leistung ein Problem darstellt. Wenn Sie relativ selten kleine Datenmengen serialisieren/deserialisieren (z. B. beim Lesen einer Konfigurationsdatei zu Beginn Ihres Programms), ist die Leistung kein wirkliches Problem und Sie können weitermachen.

Angenommen, Sie profilieren Ihr System und stellen fest, dass die Serialisierung und/oder Deserialisierung Leistungsprobleme verursacht, dann müssen die folgenden Probleme behoben werden.

Leistung hat zwei Aspekte: Wie schnell ist die Serialisierung/Deserialisierung und wie groß ist die serialisierte Darstellung?

Um die Leistung verschiedener Serialisierungsformate zu testen, werde ich eine größere Datenstruktur erstellen und diese mit Pickle, YAML und JSON serialisieren/deserialisieren. big_data Liste enthält 5.000 komplexe Objekte.

big_data = [dict(a=simple, when=datetime.now().replace(microsecond=0)) for i in range(5000)]
Nach dem Login kopieren

Kimchi

Ich werde hier IPython verwenden, da es über praktische %timeit magische Funktionen zum Messen der Ausführungszeit verfügt.

import cPickle as pickle



In [190]: %timeit serialized = pickle.dumps(big_data)

10 loops, best of 3: 51 ms per loop



In [191]: %timeit deserialized = pickle.loads(serialized)

10 loops, best of 3: 24.2 ms per loop



In [192]: deserialized == big_data

Out[192]: True



In [193]: len(serialized)

Out[193]: 747328
Nach dem Login kopieren

Standard-Pickle benötigt 83,1 Millisekunden für die Serialisierung und 29,2 Millisekunden für die Deserialisierung, mit einer serialisierten Größe von 747.328 Bytes.

Versuchen wir es mit dem höchsten Protokoll.

In [195]: %timeit serialized = pickle.dumps(big_data, protocol=pickle.HIGHEST_PROTOCOL)

10 loops, best of 3: 21.2 ms per loop



In [196]: %timeit deserialized = pickle.loads(serialized)

10 loops, best of 3: 25.2 ms per loop



In [197]: len(serialized)

Out[197]: 394350
Nach dem Login kopieren

Interessante Ergebnisse. Die Serialisierungszeit sank auf nur 21,2 ms, die Deserialisierungszeit stieg jedoch leicht auf 25,2 ms. Die serialisierte Größe wird deutlich auf 394.350 Byte (52 %) reduziert.

JSON

In [253] %timeit serialized = json.dumps(big_data, cls=CustomEncoder)

10 loops, best of 3: 34.7 ms per loop



In [253] %timeit deserialized = json.loads(serialized, object_hook=decode_object)

10 loops, best of 3: 148 ms per loop



In [255]: len(serialized)

Out[255]: 730000
Nach dem Login kopieren

Okay. Die Leistung beim Kodieren scheint etwas schlechter zu sein als bei Pickle, aber die Leistung beim Dekodieren ist viel, viel schlechter: 6x langsamer. Was ist los? Dies ist ein Artefakt der object_hook-Funktion, die für jedes Wörterbuch ausgeführt werden muss, um zu prüfen, ob es in ein Objekt konvertiert werden muss. Es läuft viel schneller, ohne Objekt-Hooks zu verwenden.

%timeit deserialized = json.loads(serialized)

10 loops, best of 3: 36.2 ms per loop
Nach dem Login kopieren

Die Lektion hier besteht darin, jede benutzerdefinierte Codierung bei der Serialisierung und Deserialisierung in JSON sorgfältig zu berücksichtigen, da sie einen erheblichen Einfluss auf die Gesamtleistung haben kann.

YAML

In [293]: %timeit serialized = yaml.dump(big_data)

1 loops, best of 3: 1.22 s per loop



In[294]: %timeit deserialized = yaml.load(serialized)

1 loops, best of 3: 2.03 s per loop



In [295]: len(serialized)

Out[295]: 200091
Nach dem Login kopieren

Okay. YAML ist wirklich sehr, sehr langsam. Beachten Sie jedoch etwas Interessantes: Die serialisierte Größe beträgt nur 200.091 Byte. Viel besser als Pickle und JSON. Werfen wir einen kurzen Blick hinein:

In [300]: print serialized[:211]

- a: &id001

    boolean: true

    int_list: [1, 2, 3]

    none: null

    number: 3.44

    text: string

  when: 2016-03-13 00:11:44

- a: *id001

  when: 2016-03-13 00:11:44

- a: *id001

  when: 2016-03-13 00:11:44
Nach dem Login kopieren

YAML ist hier sehr clever. Es stellt fest, dass alle 5.000 Wörterbücher denselben „a“-Schlüsselwert haben, speichert ihn also nur einmal und referenziert ihn mit *id001 für alle Objekte.

Sicherheit

Sicherheit ist oft ein kritisches Thema. Pickle und YAML sind aufgrund ihrer Konstruktion aus Python-Objekten anfällig für Codeausführungsangriffe. Clever formatierte Dateien können beliebigen Code enthalten, der von Pickle oder YAML ausgeführt wird. Kein Grund zur Panik. Dies ist beabsichtigt und in der Dokumentation von Pickle dokumentiert:

Warnung: Das Pickle-Modul schützt nicht vor falschen oder böswillig erstellten Daten. Löschen Sie niemals Daten, die Sie von nicht vertrauenswürdigen oder nicht authentifizierten Quellen erhalten haben.

Und was steht im YAML-Dokument:

Warnung: Es ist nicht sicher, yaml.load mit Daten aufzurufen, die von nicht vertrauenswürdigen Quellen stammen! yaml.load ist genauso leistungsstark wie pickle.load und kann daher jede Python-Funktion aufrufen.

Wissen Sie nur, dass Sie Pickle oder YAML nicht zum Laden serialisierter Daten verwenden sollten, die von nicht vertrauenswürdigen Quellen stammen. JSON ist in Ordnung, aber wenn Sie einen benutzerdefinierten Encoder/Decoder haben, sind Sie möglicherweise ebenfalls ungeschützt.

Das

yaml-Modul bietet die yaml.safe_load()-Funktion, die nur einfache Objekte lädt, aber dann verlieren Sie einen Großteil der Funktionalität von YAML und entscheiden sich möglicherweise dafür, nur JSON zu verwenden.

Andere Formate

Es sind viele andere Serialisierungsformate verfügbar. Hier sind einige davon.

Protokollpuffer

Protobuf (d. h. Protocol Buffer) ist das Datenaustauschformat von Google. Es ist in C++ implementiert, verfügt jedoch über Python-Anbindungen. Es verfügt über eine ausgefeilte Architektur und verpackt Daten effizient. Sehr leistungsstark, aber nicht sehr einfach zu bedienen.

Nachrichtenpaket

MessagePack ist ein weiteres beliebtes Serialisierungsformat. Es ist ebenfalls binär und effizient, erfordert aber im Gegensatz zu Protobuf kein Schema. Es verfügt über ein Typsystem, das JSON ähnelt, jedoch umfangreicher ist. Schlüssel können von beliebigem Typ sein, nicht nur Zeichenfolgen, und Nicht-UTF8-Zeichenfolgen werden unterstützt.

CBOR

CBOR steht für Concise Binary Object Representation. Ebenso unterstützt es das JSON-Datenmodell. CBOR ist nicht so berühmt wie Protobuf oder MessagePack, aber aus zwei Gründen interessant:

  1. Es ist ein offizieller Internetstandard: RFC 7049.
  2. Es ist für das Internet der Dinge (IoT) konzipiert.

Wie wählt man aus?

Das ist eine große Frage. So viele Möglichkeiten, wie wählt man aus? Betrachten wir die verschiedenen Faktoren, die berücksichtigt werden sollten:

  1. Sollte das Serialisierungsformat für Menschen lesbar und/oder für Menschen bearbeitbar sein?
  2. Werden Sie serialisierte Inhalte von nicht vertrauenswürdigen Quellen erhalten?
  3. Ist Serialisierung/Deserialisierung ein Leistungsengpass?
  4. Müssen serialisierte Daten mit Nicht-Python-Umgebungen ausgetauscht werden?

Ich mache es Ihnen ganz einfach und gehe ein paar gängige Szenarien und das Format durch, das ich jeweils empfehle:

Speichern Sie automatisch den lokalen Status von Python-Programmen

Verwenden Sie hier Pickle (cPickle) und HIGHEST_PROTOCOL. Es ist schnell, effizient und kann die meisten Python-Objekte ohne speziellen Code speichern und laden. Es kann auch als lokaler persistenter Cache verwendet werden.

Profil

Auf jeden Fall YAML. Für alles, was Menschen lesen oder bearbeiten müssen, geht nichts über seine Einfachheit hinaus. Es wurde von Ansible und vielen anderen Projekten erfolgreich eingesetzt. In manchen Fällen bevorzugen Sie möglicherweise die Verwendung direkter Python-Module als Konfigurationsdateien. Dies mag die richtige Wahl sein, aber es handelt sich nicht um Serialisierung, sondern um einen Teil des Programms und nicht um eine separate Konfigurationsdatei.

Web-API

JSON ist hier der klare Gewinner. Heutzutage werden Web-APIs am häufigsten von JavaScript-Webanwendungen verwendet, die JSON nativ verwenden. Einige Web-APIs geben möglicherweise andere Formate zurück (z. B. CSV für dichte tabellarische Ergebnismengen), aber ich denke, Sie können die CSV-Daten mit minimalem Overhead in JSON packen (keine Notwendigkeit, jede Zeile als Objekt mit allen Spaltennamen zu wiederholen).

Großflächige Kommunikation mit hoher Kapazität und geringer Latenz

Verwenden Sie eines der Binärprotokolle: Protobuf (falls Architektur erforderlich), MessagePack oder CBOR. Führen Sie Ihre eigenen Tests durch, um die Leistung und Darstellungsmöglichkeiten jeder Option zu überprüfen.

Fazit

Serialisierung und Deserialisierung von Python-Objekten ist ein wichtiger Aspekt verteilter Systeme. Sie können Python-Objekte nicht direkt über das Netzwerk senden. Sie müssen häufig mit anderen Systemen interagieren, die in anderen Sprachen implementiert sind, und manchmal möchten Sie einfach nur den Status Ihres Programms in einem dauerhaften Speicher speichern.

Python verfügt über mehrere Serialisierungsschemata in seiner Standardbibliothek und viele weitere sind als Module von Drittanbietern verfügbar. Wenn Sie alle Optionen sowie deren Vor- und Nachteile kennen, können Sie die Methode auswählen, die am besten zu Ihrer Situation passt.

Das obige ist der detaillierte Inhalt vonSerialisierung und Deserialisierung von Python-Objekten: Teil 2. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So verwenden Sie Python, um die ZiPF -Verteilung einer Textdatei zu finden So verwenden Sie Python, um die ZiPF -Verteilung einer Textdatei zu finden Mar 05, 2025 am 09:58 AM

Dieses Tutorial zeigt, wie man Python verwendet, um das statistische Konzept des Zipf -Gesetzes zu verarbeiten, und zeigt die Effizienz des Lesens und Sortierens großer Textdateien von Python bei der Bearbeitung des Gesetzes. Möglicherweise fragen Sie sich, was der Begriff ZiPF -Verteilung bedeutet. Um diesen Begriff zu verstehen, müssen wir zunächst das Zipf -Gesetz definieren. Mach dir keine Sorgen, ich werde versuchen, die Anweisungen zu vereinfachen. Zipf -Gesetz Das Zipf -Gesetz bedeutet einfach: In einem großen natürlichen Sprachkorpus erscheinen die am häufigsten vorkommenden Wörter ungefähr doppelt so häufig wie die zweiten häufigen Wörter, dreimal wie die dritten häufigen Wörter, viermal wie die vierten häufigen Wörter und so weiter. Schauen wir uns ein Beispiel an. Wenn Sie sich den Brown Corpus in amerikanischem Englisch ansehen, werden Sie feststellen, dass das häufigste Wort "Th ist

Wie benutze ich eine schöne Suppe, um HTML zu analysieren? Wie benutze ich eine schöne Suppe, um HTML zu analysieren? Mar 10, 2025 pm 06:54 PM

In diesem Artikel wird erklärt, wie man schöne Suppe, eine Python -Bibliothek, verwendet, um HTML zu analysieren. Es beschreibt gemeinsame Methoden wie find (), find_all (), select () und get_text () für die Datenextraktion, die Behandlung verschiedener HTML -Strukturen und -Anternativen (SEL)

Bildfilterung in Python Bildfilterung in Python Mar 03, 2025 am 09:44 AM

Der Umgang mit lauten Bildern ist ein häufiges Problem, insbesondere bei Mobiltelefonen oder mit geringen Auflösungskamera-Fotos. In diesem Tutorial wird die Bildfilterungstechniken in Python unter Verwendung von OpenCV untersucht, um dieses Problem anzugehen. Bildfilterung: Ein leistungsfähiges Werkzeug Bildfilter

Wie man mit PDF -Dokumenten mit Python arbeitet Wie man mit PDF -Dokumenten mit Python arbeitet Mar 02, 2025 am 09:54 AM

PDF-Dateien sind für ihre plattformübergreifende Kompatibilität beliebt, wobei Inhalte und Layout für Betriebssysteme, Lesegeräte und Software konsistent sind. Im Gegensatz zu Python Processing -Klartextdateien sind PDF -Dateien jedoch binäre Dateien mit komplexeren Strukturen und enthalten Elemente wie Schriftarten, Farben und Bilder. Glücklicherweise ist es nicht schwierig, PDF -Dateien mit Pythons externen Modulen zu verarbeiten. In diesem Artikel wird das PYPDF2 -Modul verwendet, um zu demonstrieren, wie Sie eine PDF -Datei öffnen, eine Seite ausdrucken und Text extrahieren. Die Erstellung und Bearbeitung von PDF -Dateien finden Sie in einem weiteren Tutorial von mir. Vorbereitung Der Kern liegt in der Verwendung von externem Modul PYPDF2. Installieren Sie es zunächst mit PIP: pip ist p

Wie kann man mit Redis in Django -Anwendungen zwischenstrichen Wie kann man mit Redis in Django -Anwendungen zwischenstrichen Mar 02, 2025 am 10:10 AM

Dieses Tutorial zeigt, wie man Redis Caching nutzt, um die Leistung von Python -Anwendungen zu steigern, insbesondere innerhalb eines Django -Frameworks. Wir werden Redis -Installation, Django -Konfiguration und Leistungsvergleiche abdecken, um den Vorteil hervorzuheben

Wie führe ich ein tiefes Lernen mit Tensorflow oder Pytorch durch? Wie führe ich ein tiefes Lernen mit Tensorflow oder Pytorch durch? Mar 10, 2025 pm 06:52 PM

Dieser Artikel vergleicht TensorFlow und Pytorch für Deep Learning. Es beschreibt die beteiligten Schritte: Datenvorbereitung, Modellbildung, Schulung, Bewertung und Bereitstellung. Wichtige Unterschiede zwischen den Frameworks, insbesondere bezüglich des rechnerischen Graps

Einführung in die parallele und gleichzeitige Programmierung in Python Einführung in die parallele und gleichzeitige Programmierung in Python Mar 03, 2025 am 10:32 AM

Python, ein Favorit für Datenwissenschaft und Verarbeitung, bietet ein reichhaltiges Ökosystem für Hochleistungs-Computing. Die parallele Programmierung in Python stellt jedoch einzigartige Herausforderungen dar. Dieses Tutorial untersucht diese Herausforderungen und konzentriert sich auf die globale Interprete

So implementieren Sie Ihre eigene Datenstruktur in Python So implementieren Sie Ihre eigene Datenstruktur in Python Mar 03, 2025 am 09:28 AM

Dieses Tutorial zeigt, dass eine benutzerdefinierte Pipeline -Datenstruktur in Python 3 erstellt wird, wobei Klassen und Bedienerüberladungen für verbesserte Funktionen genutzt werden. Die Flexibilität der Pipeline liegt in ihrer Fähigkeit, eine Reihe von Funktionen auf einen Datensatz GE anzuwenden

See all articles