NumPy 2.0.0 is de eerste grote release sinds 2006. Deze versie is het resultaat van 11 maanden ontwikkeling sinds de laatste functie-update en is het werk van 212 bijdragers verspreid over 1078 pull requests. Het bevat een groot aantal opwindende nieuwe functies en wijzigingen aan zowel de Python- als de C API's. Deze grote release bevat ingrijpende veranderingen die niet mogelijk waren in een reguliere kleinere (feature) release, zoals een ABI-breuk, wijzigingen in type promotie regels en API veranderingen die mogelijk geen deprecatie waarschuwingen afgaven in 1.26.x. Belangrijke documenten over hoe je je kunt aanpassen aan de veranderingen in NumPy 2.0, naast deze release notities, zijn onder andere:
- De NumPy 2.0 migratiegids
- Specifieke adviezen voor downstream package auteurs in NumPy 2.0
Dit zijn de highlights!
Nieuwe functies:
- Een nieuw variabele-lengte string dtype, StringDType, en een nieuwe
numpy.strings
namespace met efficiënte ufuncs voor string bewerkingen. - Ondersteuning voor float32 en longdouble in alle
numpy.fft
functies. - Ondersteuning voor de array API standaard in de hoofd numpy namespace.
Prestatieverbeteringen:
- Sorteerfuncties (
sort
, argsort
, partition
, argpartition
) zijn versneld door gebruik te maken van de Intel x86-simd-sort en Google Highway bibliotheken, wat aanzienlijke (hardware-specifieke) snelheidsverbeteringen kan opleveren. - Ondersteuning voor macOS Accelerate en binaire wielen voor macOS >=14, met aanzienlijke prestatieverbeteringen voor lineaire algebra operaties op macOS, en wielen die ongeveer 3 keer kleiner zijn.
numpy.char
vaste-lengte string bewerkingen zijn versneld door implementatie van ufuncs die ook StringDType ondersteunen naast de vaste-lengte string dtypes.- Een nieuwe tracing en introspectie API,
opt_func_info
, om te bepalen welke hardware-specifieke kernels beschikbaar zijn en zullen worden gebruikt. numpy.save
gebruikt nu pickle protocol versie 4 voor het opslaan van arrays met object dtype, wat het mogelijk maakt om pickle objecten groter dan 4GB te ondersteunen en de opslagsnelheid met ongeveer 5% te verbeteren voor grote arrays.
Verbeteringen aan de Python API:
- Een duidelijke scheiding tussen publieke en private API, met een nieuwe module structuur, en elke publieke functie nu beschikbaar op een enkele plaats.
- Veel verwijderingen van niet-aanbevolen functies en aliassen. Dit moet het gemakkelijker maken om NumPy te leren en te gebruiken. Het aantal objecten in de hoofd namespace is met ongeveer 10% verminderd en in
numpy.lib
met ongeveer 80%. - Canonieke dtype namen en een nieuwe
isdtype
introspectie functie.
Verbeteringen aan de C API:
- Een nieuwe publieke C API voor het creëren van custom dtypes.
- Veel verouderde functies en macro's verwijderd, en private internals verborgen om toekomstige uitbreidbaarheid te vergemakkelijken.
- Nieuwe, gebruiksvriendelijkere initialisatiefuncties:
PyArray_ImportNumPyAPI
en PyUFunc_ImportUFuncAPI
.
Verbeterd gedrag:
- Verbeteringen in type promotie gedrag door adoptie van NEP 50. Dit verhelpt veel onverwachte promoties die eerder vaak afhankelijk waren van de gegevenswaarden van invoerarrays in plaats van alleen hun dtypes. Raadpleeg de NEP en de NumPy 2.0 migratiegids voor details, aangezien deze wijziging kan leiden tot veranderingen in output dtypes en lagere precisie resultaten voor mixed-dtype operaties.
- Het standaard integer type op Windows is nu int64 in plaats van int32, wat overeenkomt met het gedrag op andere platforms.
- Het maximale aantal array dimensies is veranderd van 32 naar 64.
Documentatie:
- De navigatie van de referentiegids is aanzienlijk verbeterd, en er is nu documentatie over NumPy’s module structuur.
- De documentatie voor het bouwen vanaf de bron is volledig herschreven.
- Daarnaast zijn er veel veranderingen aan NumPy internals, waaronder de voortdurende migratie van code van C naar C++, wat het gemakkelijker zal maken om NumPy in de toekomst te verbeteren en te onderhouden.
Het "no free lunch" principe dicteert dat er een prijs moet worden betaald voor al deze API en gedragsverbeteringen en betere toekomstige uitbreidbaarheid. Deze prijs is:
- Achterwaartse compatibiliteit. Er zijn een significant aantal breaking changes aan zowel de Python- als de C API's. In de meeste gevallen zijn er duidelijke foutmeldingen die de gebruiker informeren hoe ze hun code kunnen aanpassen. Er zijn echter ook gedragsveranderingen waarvoor het niet mogelijk was om zo'n foutmelding te geven - deze gevallen zijn allemaal gedekt in de Deprecation en Compatibility secties hieronder, en in de NumPy 2.0 migratiegids.
- Let op dat er een ruff mode is om veel dingen automatisch te fixen in Python code.
- Breaking changes aan de NumPy ABI. Als gevolg daarvan zullen binaries van pakketten die de NumPy C API gebruiken en zijn gebouwd tegen een NumPy 1.xx release niet werken met NumPy 2.0. Bij import zullen dergelijke pakketten een ImportError zien met een bericht over binaire incompatibiliteit.
- Het is mogelijk om binaries te bouwen tegen NumPy 2.0 die zowel bij runtime werken met NumPy 2.0 als 1.x. Zie de specifieke adviezen voor NumPy 2.0 voor meer details.
- Alle downstream pakketten die afhankelijk zijn van de NumPy ABI worden geadviseerd om een nieuwe release te doen die is gebouwd tegen NumPy 2.0 en te verifiëren dat die release werkt met zowel 2.0 als 1.26 - idealiter in de periode tussen 2.0.0rc1 (die ABI-stabiel zal zijn) en de definitieve 2.0.0 release om problemen voor hun gebruikers te voorkomen.
De Python versies die door deze release worden ondersteund zijn 3.9-3.12.
Bron: www.numpy.org