Unterschied zwischen MicroPython und CPython

Unterschied zwischen MicroPython und CPython

MicroPython unterstützt nicht alle Python-Standardbibliotheken. Die ausgeschlossenen Module sind für die Verwendung mit dem eingebetteten Controller nicht geeignet. Einige Module können vom Mikrocontroller aufgrund eines hohen Speicherverbrauchs (z. B. sqlite3) oder mangelnder erforderlicher Hardwarefunktionalität (z. B. Multiprocessing) nicht implementiert werden. Eine vollständige Liste der Python-Standardbibliotheken finden Sie hier: Python 3.4 Standard lib

Es gibt einige Unterschiede zwischen CPython3 (eine Referenzimplementierung der Python3-Sprache) und MicroPython. Unterschiede fallen in drei Kategorien. Jede Kategorie hat einen anderen Status hinsichtlich der Möglichkeit, dass sich die in jeder Kategorie klassifizierten Elemente ändern.

Designunterschied

MicroPython ist für Umgebungen mit eingeschränkteren Bedingungen vorgesehen, insbesondere für Umgebungen mit mehr Leistung und Speicherbeschränkungen als das "Desktop" -System, auf dem CPython3 ausgeführt wird. Kurz gesagt, MicroPython muss unter Berücksichtigung dieser eingeschränkten Umgebung entwickelt werden, mit Ausnahme von Funktionen, die nicht zum Zielsystem passen oder nicht skaliert werden können. Es ist unwahrscheinlich, dass Sie den Unterschied im "Design" ändern.

  1. MicroPython enthält keine umfangreiche Standardbibliothek von Modulen. Es ist unmöglich und unangemessen, eine vollständige CPython3-Bibliothek bereitzustellen. Viele Module sind im Kontext eingebetteter Systeme weder verfügbar noch nützlich. Es ist nicht genügend Speicher vorhanden, um die gesamte Bibliothek auf einem kleinen Gerät bereitzustellen. Daher verfolgt MicroPython einen minimalen Ansatz. Der Interpreter enthält nur den Kerndatentyp (+ Module, die für eine bestimmte Hardware spezifisch sind), und der Rest hängt vom Drittanbieter der jeweiligen Benutzeranwendung ab. Das Projekt micropython-lib bietet eine nicht monolithische Standardbibliothek für MicroPython (Forum. viewtopic.php? f = 5 & t = 70))

  2. Im Gegensatz zu CPython3, das Referenzzählungen verwendet, verwendet MicroPython die Speicherbereinigung als primäres Mittel zur Speicherverwaltung.

  3. MicroPython implementiert nicht das vollständige CPython-Objektdatenmodell, sondern nur eine Teilmenge davon. Die Methode "new", bei der es sich um eine erweiterte Verwendung der Mehrfachvererbung handelt, funktioniert möglicherweise nicht. Die Reihenfolge der Methodenauflösung ist unterschiedlich (# 525). Metaklassen werden (zumindest noch nicht) nicht unterstützt.

  4. Das Design von MicroPython basiert nicht auf Deskriptorobjekten. Bisher wurden alle nativen Python-Funktionen (und Eigenschaften usw.) implementiert, mit Ausnahme expliziter Deskriptoren. Deskriptoren gelten als "zu dynamische" Merkmale, was dem Ziel widerspricht, schnell und effizient zu sein. Als Opt-In-Funktion haben wir jedoch eine vereinfachte Unterstützung für Deskriptoren implementiert.

  5. Da MicroPython "Micro" ist, implementiert es nur eine Teilmenge von Features und Parametern einer bestimmten Funktion oder Klasse. Jedes einzelne Problem kann als "Unterschied in der Implementierung" behandelt und behoben werden, es ist jedoch unwahrscheinlich, dass es 100% der Funktionalität von CPython abdeckt.

  6. Da MicroPython "Mikro" ist, unterstützt es nur eine minimale Teilmenge von Introspektions- und Reflexionsfunktionen (Objektnamen, Dokumentzeichenfolgen usw.). Jedes einzelne Feature wird als Implementierungsunterschied behandelt und kann behoben werden, es ist jedoch unwahrscheinlich, dass 100% der CPython-Features abgedeckt werden.

  7. Die Funktion print () überprüft nicht die rekursiven Datenstrukturen, die CPython verarbeitet. Da jedoch die Stapelverwendung überprüft wird, stürzt die Anzeige rekursiver Datenstrukturen nicht aufgrund eines Stapelüberlaufs ab. Es ist möglich, eine CPython-ähnliche Verarbeitung für rekursive Datenstrukturen auf Python-Anwendungsebene zu implementieren. Erstellen Sie eine Funktion, die einen Verlauf jedes referenzierten Objekts speichert, und überschreiben Sie das integrierte print () mit einer benutzerdefinierten Funktion. Eine solche Implementierung kann natürlich viel Speicher verbrauchen. Daher ist es nicht auf MicroPython-Ebene implementiert.

  8. MicroPython optimiert den Umgang mit lokalen Variablen und zeichnet keine Informationen zur Selbstbeobachtung auf. Beispielsweise hat local () keine Einträge für lokale Variablen.

Implementierungsunterschiede

Einige Funktionen sind möglicherweise nicht mit eingeschränkten Systemen kompatibel oder lassen sich möglicherweise nicht einfach effizient implementieren. Solche Funktionen werden als "Implementierungsunterschiede" bezeichnet, und einige können (nach entsprechender Diskussion und Prüfung) einer zukünftigen Entwicklung unterliegen. Viele der "Implementierungsunterschiede" wirken sich auf die Größe und Leistung von MicroPython-Implementierungen aus, sodass einige MicroPython-Ziele möglicherweise bestimmte Funktionen nicht implementieren.

  1. Die Unicode-Unterstützung wird ausgeführt. Es basiert auf einer internen Darstellung mit UTF-8. Volle Unterstützung für Zeichenfolgen, die Unicode-Escapezeichen in den Formaten \ xNN, \ uNNNN und \ U000NNNNN enthalten. \ N {...} wird nicht unterstützt. # 695.

  2. Die Objektfinalisierung (__del__ () -Methode) wird vom integrierten Typ nicht unterstützt, wird jedoch von der Benutzerklasse unterstützt. Dies wird von # 245 unterstützt.

  3. Die integrierte Unterklasse ist teilweise implementiert, weist jedoch verschiedene Unterschiede und Kompatibilitätsprobleme mit CPython auf. # 401

  4. Es werden keine gepufferten E / A-Streams (io.TextIOWrapper und seine Oberklassen) unterstützt.

  5. Das Schlüsselwort "async def" wird wie folgt vereinfacht und implementiert: Es gibt keinen separaten Objekttyp "coroutine", und "async def" ist die "Ausbeute" oder "Ausbeute von", die im Funktionskörper angezeigt wird. Definieren Sie einfach eine Generatorfunktion, für die nichts erforderlich ist. Die Verwendung von "Ausbeute" oder "Ausbeute von" in der Funktion "async def" wird nicht erkannt oder verboten.

  6. "asynchron mit" sollte der Beschreibung in PEP492 entsprechen.

  7. "async for" sollte der Beschreibung in PEP492 entsprechen.

  8. Die Methode "await" unterstützt keine "zukunftsähnlichen Objekte". Das Warten ist nur für Collouts und Generatoren verfügbar (nicht für "Zukunftsähnliche Objekte"). Es ist auch nur ein "Ertrag aus" Syntaxzucker, der Iterables und Iteratoren akzeptiert, die CPython nicht zulässt.

  9. Unterstützung zum Beispiel __dict __ ist optional (in vielen Ports deaktiviert) und schreibgeschützt, also foo .__ dict __ ['bar'] = 23 oderfoo .__ dict __. Update ({'bar': 23})funktioniert nicht. # 1757, # 2139

Bekannte Probleme

Bekannte Probleme werden im Wesentlichen als Fehler oder falsche Funktionen angesehen und behoben. Daher sollten Sie sich im Idealfall auch auf das Bug-Ticket beziehen, um zu erfahren, was hier geschrieben steht. Beachten Sie jedoch, dass diese bekannten Probleme unterschiedliche Prioritäten haben, insbesondere innerhalb des umfassenderen Entwicklungsprozesses. Wenn Sie tatsächlich von dem Problem betroffen sind, fügen Sie Ihrem Ticket die Falldetails hinzu (registrieren Sie sich, wenn das Ticket noch nicht vorhanden ist), um es in Ihrem Plan wiederzugeben. Das Senden von Patches ist noch produktiver. (Beachten Sie, dass die Liste der nicht implementierten Module / Klassen nur diejenigen enthält, deren Implementierung als sehr wichtig angesehen wird. Wie bereits erwähnt, bietet MicroPython eine allgemeine vollständige Standardbibliothek. Abwesend.

  1. Einige Funktionen überprüfen ihre Argumente nicht ausreichend und können abstürzen, wenn der falsche Argumenttyp übergeben wird. ~~

  2. Einige Funktionen verwenden "assert ()", um Argumente zu überprüfen. Falscher Argumenttyp übergeben → Falsche Bedingungen führen zum Absturz. Ersetzen Sie dies durch eine Python-Ausnahme.

  3. ~~ Integrierte Funktionen können nicht auf die übliche Weise überschrieben werden. Bisher wurde das "eingebaute" Modul nicht implementiert, sodass alle Überschreibungen nur innerhalb des aktuellen Moduls funktionieren. # 959 ~~

  4. Die permanente Bytecode-Unterstützung (.pyc-Analog) befindet sich in der Beta.

  5. Die Funktion ~~ print () verwendet nicht die Python-Stream-Infrastruktur, sondern direkt die zugrunde liegende Funktion C printf (). Das Überschreiben von sys.stdout wirkt sich also nicht auf print () aus. # 209 ~~

  6. Derzeit können sys.stdin, sys.stdout und sys.stderr nicht überschrieben werden (aus Effizienzgründen werden sie im Nur-Lese-Speicher gespeichert).

  7. ~~ Die fortgeschrittenere Verwendung von Paket- / Modulimporten wurde noch nicht vollständig implementiert. # 298 ~~

  8. ~~ Die Ausnahmebehandlung durch den Generator ist nicht vollständig implementiert. ~~ (Einige kleine Details müssen möglicherweise noch behandelt werden.) # 243

  9. str.format () kann erweiterte / mehrdeutige Funktionen übersehen (Aber fast vollständig implementiert). \ # 407, # 574

  10. Der Zeichenfolgenformatoperator ~~% hat möglicherweise erweiterte Funktionen verpasst ~~ # 403, [# 574] ](Https://github.com/micropython/micropython/issues/574)

  11. Die Implementierung des struct-Moduls (mit dem Namen ustruct) sollte alle grundlegenden Funktionen ~~ haben, aber einige Syntaxzucker (wie das Wiederholen von Typzeichenfolgen). Nein ~~. Umbenannt in die vollständige struct -Funktion, die auf Python-Ebene funktioniert

  12. Anstelle des "re" -Moduls ist das minimierte "ure" -Modul eine Teilmenge der von re bereitgestellten Funktionalität. micropython-lib bietet eine vollständige Implementierung basierend auf der "PCRE" -Engine für die "Unix" -Portierung # 13.

  13. Bisher gibt es nur das "io" -Modul und den Beginn der Klassenhierarchie.

  14. Die Klasse "collection.deque" ist nicht implementiert.

  15. ~~ memoryview Objekt ist nicht implementiert. ~~

  16. Die Zuweisung / Löschung von Container-Slices ist nur teilweise implementiert. # 509

17.3 Argument Slicing ist nur teilweise implementiert.

  1. ~~ Schlüsselwörter und Nur-Schlüsselwort-Argumente erfordern mehr Arbeit. ~~ # 466, # 524

  2. Für die Methode "new" \ # 606, [# 622](https: // github) ist nur grundlegende Unterstützung verfügbar. com / micropython / micropython / issue / 622)

  3. ~~ lange Int-Bit-Operation ist nur teilweise implementiert (X & 0xffffffff-Idiom für die Aufgabe, vorzeichenbehaftete 32-Bit-Werte ohne Vorzeichen umzuwandeln). ~~ # 1810

Recommended Posts

Unterschied zwischen MicroPython und CPython
Unterschied zwischen Prozess und Job
Unterschied zwischen "categoryical_crossentropy" und "sparse_categorical_crossentropy"
Unterschied zwischen Regression und Klassifikation
Unterschied zwischen np.array und np.arange
Unterschied zwischen ps a und ps -a
Unterschied zwischen Return und Print-Python
Unterschied zwischen Ruby und Python Split
Unterschied zwischen Java und Python (Memo)
Unterschied zwischen list () und [] in Python
Unterschied zwischen SQLAlchemy filter () und filter_by ()
Unterschied zwischen == und ist in Python
Memorandum (Unterschied zwischen csv.reader und csv.dictreader)
Unterschied zwischen Numpys Randint und Randoms Randint
Unterschied zwischen sortiert und sortiert (Denkmal)
Unterschied zwischen der Python2-Serie und der Python3-Serie dict.keys ()
Geschwindigkeitsvergleich zwischen CPython und PyPy
[Python] Unterschied zwischen Funktion und Methode
Unterschied zwischen SQLAlchemy flush () und commit ()
Python - Unterschied zwischen exec und eval
[Python] Unterschied zwischen randrange () und randint ()
[Python] Unterschied zwischen sortiert und sortiert (Colaboratory)
[Xg Boost] Unterschied zwischen Softmax und Softprob
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
[Django ORM] Unterschied zwischen Werten () und nur ()
Unterschiede in der Beziehung zwischen PHP und Python schließlich und beenden
Unterschied zwischen @classmethod und @staticmethod in Python
Unterschied zwischen linearer Regression, Ridge-Regression und Lasso-Regression
[Python] Unterschied zwischen Klassenmethode und statischer Methode
Unterschied zwischen Docker-Compose-Datei env_file und .env-Datei
[Python Iroha] Unterschied zwischen Liste und Tupel
[Python] Unterschied zwischen Rand- und Randn-Ausgabe
Geschwindigkeitsunterschied zwischen wsgi, Flasche und Flasche
Unterschied zwischen numpy.ndarray und list (Dimension, Größe)
Unterschied zwischen ls -l und cat Befehl
Differenz- und Kompatibilitätsprüfung zwischen Keras und tf.keras # 1
Was ist der Unterschied zwischen "pip" und "conda"?
Unterschied zwischen Verwendung und Import in der Schildsprache
Unterschied zwischen Variablen und Selbst. Variablen in der [Python] -Klasse
Über den Unterschied zwischen "==" und "is" in Python
Über den Unterschied zwischen PostgreSQL su und sudo
Was ist der Unterschied zwischen Unix und Linux?
Mittendifferenz und Vorwärtsdifferenz
Zwischen parametrisch und nicht parametrisch
Berücksichtigung des Unterschieds zwischen ROC-Kurve und PR-Kurve
Grober Unterschied zwischen Unicode und UTF-8 (und seinen Begleitern)
Kann BERT den Unterschied zwischen "Ame (Süßigkeiten)" und "Ame (Regen)" verstehen?
Unterschied zwischen Ruby und Python in Bezug auf Variablen
Was ist der Unterschied zwischen usleep, nanosleep und clock_nanosleep?
Unterschied zwischen Numpy (n,) und (n, 1) Notation [Unterschied zwischen horizontalem Vektor und vertikalem Vektor]
Unterschied zwischen return, return None und no return description in Python
Wie man Argparse benutzt und den Unterschied zwischen Optparse
Was ist der Unterschied zwischen symbolischen und harten Links?
Konvertierung zwischen Unixtime und Datetime
Python-Modul num2words Verhaltensunterschied zwischen Englisch und Russisch
Python> Unterschied zwischen Inpbt- und Print-Ausgabe (Inpbt)> [1. 2. 3.] / Array ([1., 2., 3.], dtype = float32)
Listenverkettungsmethode in Python, Unterschied zwischen list.extend () und dem Operator "+"
Zusammenarbeit zwischen PTVS und Anaconda
Unterschied zwischen SQL Alchemy back_populated und backref und wenn keiner verwendet wird