Nach einem Jahr Entwicklung bedeutende Veröffentlichung der Programmiersprache . Python 3.9 war die erste Veröffentlichung nach dem Projekt ĂŒber der Vorbereitung und Betreuung von Releases. Bedeutende Veröffentlichungen werden nun einmal jĂ€hrlich erstellt, und Wartungsupdates erscheinen alle zwei Monate. Jede bedeutende Version wird eineinhalb Jahre lang unterstĂŒtzt, anschlieĂend werden fĂŒr sie noch dreieinhalb Jahre lang Sicherheitsupdates bereitgestellt.
Die Arbeit an einem neuen Branch beginnt nun fĂŒnf Monate vor der Veröffentlichung des nĂ€chsten Branches, d.h. gleichzeitig mit dem Release von Python 3.9 Alpha-Tests fĂŒr den Branch Python 3.10. Der Branch Python 3.10 wird sich fĂŒr sieben Monate in der Alpha-Version befinden, wĂ€hrend dieser Zeit werden neue Funktionen hinzugefĂŒgt und Fehler behoben. AnschlieĂend wird es drei Monate lang Beta-Tests geben, in denen das HinzufĂŒgen neuer Funktionen verboten ist und der gesamte Fokus auf der Fehlerbehebung liegt. Die letzten zwei Monate vor der Veröffentlichung wird der Branch sich im Release-Kandidaten-Status befinden, in dem die finale Stabilisierung durchgefĂŒhrt wird.
in Python 3.9:
- In Dictionaries, die mit der eingebauten Klasse dict definiert sind, UnterstĂŒtzung der Merge-Operatoren â|â und Update-Operatoren â|=â, die die Methoden {**d1, **d2} und dict.update ergĂ€nzen, die zuvor zum ZusammenfĂŒhren von Dictionaries angeboten wurden.
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}>>> x | y
{"key1": "value1 from x", "key2": "value2 from y", "key3": "value3 from y"}>>> y | x
{"key2": "value2 from x", "key3": "value3 from y", "key1": "value1 from x"} - Die eingebaute Typensammlung umfasst list, dict und tuple, die als Basisdatenarten ohne Import aus dem Modul typing verwendet werden können. Das heiĂt, anstelle von typing.List, typing.Dict und typing.Tuple können jetzt einfach
list, dict und tuple angegeben werden:def greet_all(names: list[str]) -> None:
for name in names:
print('Hello', name) - flexible Mittel zur AnnotationsfunktionalitĂ€t und Variablen bereitgestellt. Um Anmerkungen hinzuzufĂŒgen, wurde in das Modul typing ein neuer Typ Annotated eingefĂŒhrt, der bestehende Typen um zusĂ€tzliche Metadaten erweitert, die bei der statischen Analyse oder zur Optimierung zur Laufzeit verwendet werden können. Um auf die Metadaten aus dem Code zuzugreifen, wurde dem Methodentyp typing.get_type_hints() ein Parameter include_extras hinzugefĂŒgt.
charType = Annotated[int, ctype('char')]
UnsignedShort = Annotated[int, struct2.ctype('H')] - Die grammatikalischen Anforderungen an Dekoratoren â jede AusdrĂŒcke, die geeignet sind fĂŒr die Verwendung in if- und while-Blöcken, können jetzt als Dekorator verwendet werden. Diese Ănderung hat die Lesbarkeit des PyQt5-Codes erheblich verbessert und die Wartung dieses Moduls vereinfacht:
War:
button_0 = buttons[0]
@button_0.clicked.connectJetzt kann man schreiben:
@buttons[0].clicked.connect - In die Standardbibliothek Modul , die Informationen aus der IANA-Zeitzonendatenbank enthÀlt.
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Sommerzeit
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00>>> dt.tzname()
'PDT'>>> # Standardzeit
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00>>> print(dt.tzname())
PST - Das Modul graphlib wurde hinzugefĂŒgt, in dem die UnterstĂŒtzung fĂŒr topologische Sortierung von Graphen enthalten ist.
- neue Methoden zum Entfernen von PrĂ€fixen und Suffixen von Zeichenfolgen vorgeschlagen â str.removeprefix(prefix) und str.removesuffix(suffix). Die Methoden wurden zu den Objekten str, bytes, bytearray und collections.UserString hinzugefĂŒgt.
>>> s = "FooBar"
>>> s.removeprefix("Foo")
'Bar' - (Parsing Expression Grammar), der den Parser LL(1) ersetzt hat. . Die EinfĂŒhrung des neuen Parsers hat es ermöglicht, einige âHacksâ zum Umgehen der EinschrĂ€nkungen in LL(1) zu beseitigen und die Wartungskosten des Parsers erheblich zu senken. In Bezug auf die Leistung liegt der neue Parser ungefĂ€hr auf dem gleichen Niveau wie der alte, ĂŒbertrifft ihn jedoch deutlich bei der FlexibilitĂ€t, was ein freieres Design neuer Sprachfunktionen erlaubt. Der Code des alten Parsers bleibt vorerst erhalten und kann mit dem Flag â-X oldparserâ oder der Umgebungsvariable âPYTHONOLDPARSER=1â wiederhergestellt werden, wird jedoch in der Version 3.10 entfernt.
- Die Möglichkeit fĂŒr C-Extensions, auf den Zustand der Module zuzugreifen, in denen sie definiert sind, unter Verwendung der direkten Dereferenzierung von Zeigern anstelle der Suche nach dem Modulzustand ĂŒber die Funktion PyState_FindModule. Diese Ănderung verbessert die Leistung von C-Modulen, indem die Overheads fĂŒr die ĂberprĂŒfung des Modulzustands verringert oder vollstĂ€ndig ausgeschlossen werden. Eine C-Funktion namens PyType_FromModuleAndSpec() wird vorgeschlagen, um ein Modul mit einer Klasse zu assoziieren, wĂ€hrend die C-Funktionen PyType_GetModule() und PyType_GetModuleState() genutzt werden können, um das Modul und seinen Zustand abzurufen. Die C-Funktion PyCMethod und das Flag METH_METHOD ermöglichen den Zugriff auf die Klasse, in der die Methode definiert ist.
- Garbage Collector von der Sperrung von Sammlungen, die reanimierte Objekte enthalten, die nach dem AusfĂŒhren des Finalizers weiterhin von auĂen zugĂ€nglich sind.
- Es wurde die Methode , was die Verwendung des âpidfdâ-Kernelsubsystems von Linux ermöglicht, um mit der Situation des Wiederverwendens von PIDs umzugehen (pidfd ist an einen bestimmten Prozess gebunden und Ă€ndert sich nicht, wĂ€hrend der PID nach Abschluss des aktuellen Prozesses, der mit diesem PID assoziiert ist, an einen anderen Prozess gebunden werden kann).
- Die UnterstĂŒtzung der Unicode-Spezifikation wurde auf Version 13.0.0 aktualisiert.
- Beheben bei der erneuten Initialisierung des Python-Interpreters in einem Prozess.
- Die Leistung der eingebauten Typen range, tuple, set, frozenset, list und dict wurde optimiert, durch die Anwendung des Vectorcall-Schnellaufrufprotokolls fĂŒr einen schnelleren Zugriff auf in C geschriebenen Objekte.
- Die Module _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time und _weakref wurden auf ein mehrstufiges Laden umgestellt .
- Die Module der Standardbibliothek audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios und zlib wurden auf die Verwendung eines eingeschrĂ€nkten , der das Problem der FunktionsfĂ€higkeit von Erweiterungsmodul-Bauten fĂŒr verschiedene Python-Versionen löst (bei Aktualisierungen ist kein Neukompilieren der Erweiterungsmodule erforderlich, und Module, die fĂŒr 3.9 gebaut wurden, können in der Version 3.10 verwendet werden).
- Im asyncio-Modul wurde aufgrund potenzieller Sicherheitsprobleme die UnterstĂŒtzung des Parameters reuse_address eingestellt (die Verwendung von SO_REUSEADDR fĂŒr UDP unter Linux ermöglicht es verschiedenen Prozessen, Listener-Sockets an einen UDP-Port anzuhĂ€ngen).
- Neue Optimierungen wurden hinzugefĂŒgt, wie zum Beispiel die verbesserte Leistung von Signalverarbeitern in multithreaded Anwendungen, die erhöhte Geschwindigkeit des subprocess-Moduls in der FreeBSD-Umgebung und die beschleunigte Zuweisung temporĂ€rer Variablen (die Zuweisung einer Variablen im Ausdruck âfor y in [expr]â ist nun auf gleicher Leistungsstufe wie der Ausdruck ây = exprâ). Insgesamt zeigen die meisten Tests Ein RĂŒckgang der Leistung im Vergleich zu Version 3.8 (Beschleunigungen wurden nur in den Tests write_local und write_deque beobachtet):
Python-Version 3.4 3.5 3.6 3.7 3.8 3.9
âââââ â â â â â âZugriff auf Variablen und Attribute:
read_local 7.1 7.1 5.4 5.1 3.9 4.0
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
read_global 15.5 19.0 14.3 13.6 7.6 7.7
read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6
read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1
read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
read_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9Zugriff auf das Schreiben von Variablen und Attributen:
write_local 8.7 9.3 5.5 5.3 4.3 4.2
write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
write_global 19.7 21.2 18.0 18.0 15.8 17.2
write_classvar 92.9 96.0 104.6 102.1 39.2 43.2
write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7Zugriff auf Datenstruktur:
read_list 24.2 24.5 20.8 20.8 19.0 21.1
read_deque 24.7 25.5 20.2 20.6 19.8 21.6
read_dict 24.3 25.7 22.3 23.0 21.0 22.5
read_strdict 22.6 24.3 19.5 21.2 18.9 21.6Schreiben auf Datenstruktur:
write_list 27.1 28.5 22.5 21.6 20.0 21.6
write_deque 28.7 30.1 22.7 21.8 23.5 23.2
write_dict 31.4 33.3 29.3 29.2 24.7 27.8
write_strdict 28.4 29.9 27.5 25.2 23.1 29.8Stack- (oder Warteschlangen-) Operationen:
list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5Timing-Schleife:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3 - viele Funktionen und Methoden von Python 2.7, die zuvor als veraltet markiert wurden und im letzten Release zu einer DeprecationWarning fĂŒhrten, einschlieĂlich der Methode unescape() in html.parser.HTMLParser,
tostring() und fromstring() in array.array, isAlive() in threading.Thread, getchildren() und getiterator() in ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() und base64.decodestring().
Quelle: opennet.ru
