Hoe maak je een lijst met een specifieke grootte in Python

  1. Opslag vooraf toewijzen voor lijsten
  2. Opslag vooraf toewijzen aan andere opeenvolgende datastructuren

Het vooraf toewijzen van opslag voor lijsten of arrays is een typisch patroon onder programmeurs wanneer zij vooraf het aantal elementen kennen.

In tegenstelling tot C++ en Java, moet u in Python al uw vooraf toegewezen opslag initialiseren met enkele waarden. Meestal ontwikkelaars valse waarden daarvoor, zoals None , '' , False en 0.

Python biedt verschillende manieren om een ​​lijst met een vaste grootte te maken, elk met verschillende prestatiekenmerken.

Om de prestaties van verschillende benaderingen te vergelijken, gebruiken we de standaardmodule van Python timeit . Het biedt een handige manier om looptijden van kleine stukjes Python-code te meten.

Opslag vooraf toewijzen voor lijsten

De eerste en snelste manier om de * operator te gebruiken , die een lijst een bepaald aantal keren herhaalt.

>>> [None] * 10
[None, None, None, None, None, None, None, None, None, None]

Een miljoen iteraties (standaardwaarde van iteraties in timeit ) duren ongeveer 117 ms.

>>> timeit("[None] * 10")
0.11655918900214601

Een andere benadering is om de range ingebouwde functie te gebruiken met een lijstbegrip.

>>> [None for _ in range(10)]
[None, None, None, None, None, None, None, None, None, None]

Het is bijna zes keer langzamer en duurt 612 ms seconde per miljoen iteraties.

>>> timeit("[None for _ in range(10)]")
0.6115895550028654

De derde benadering is om een ​​eenvoudige for lus te gebruiken samen met de list.append().

>>> a = []
>>> for _ in range(10):
...   a.append(None)
...
>>> a
[None, None, None, None, None, None, None, None, None, None]

Het gebruik van lussen is de langzaamste methode en kost 842 ms om een ​​miljoen iteraties te voltooien.

>>> timeit("for _ in range(10): a.append(None)", setup="a=[]")
0.8420009529945673

Opslag vooraf toewijzen aan andere opeenvolgende datastructuren

Omdat u opslag vooraf toewijst voor een sequentiële gegevensstructuur, kan het verstandig zijn om de array ingebouwde gegevensstructuur te gebruiken in plaats van een lijst.

>>> from array import array
>>> array('i',(0,)*10)
array('i', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

Zoals we hieronder zien, is deze benadering de op een na snelste [None] * 10.

>>> timeit("array('i',(0,)*10)", setup="from array import array")
0.4557597979946877

Laten we de bovenstaande pure Python-benaderingen vergelijken met het NumPy Python-pakket voor wetenschappelijk computergebruik.

>>> from numpy import empty
>>> empty(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

De NumPy-manier kost 589 ms per miljoen iteraties.

>>> timeit("empty(10)", setup="from numpy import empty")
0.5890094790011062

De NumPy-manier zal echter veel sneller zijn voor meer massieve lijsten.

>>> timeit("[None]*10000")
16.059584009999526
>>> timeit("empty(10000)", setup="from numpy import empty")
1.1065983309963485

De conclusie is dat het het beste is om [None] * 10 bij kleine lijsten te blijven, maar over te schakelen naar NumPy’s empty() wanneer het gaat om meer massieve sequentiële gegevens.

Gerelateerde Artikelen - Python List

  • Wat is het verschil tussen lijstmethoden toevoegen en uitbreiden
  • Een lijst converteren naar tekenreeks in Python
  • Hoe twee of meerdere lijsten in Python samen te voegen
  • Wat is het verschil tussen del, verwijder en pop op Python-lijsten