Geschiedenis van de kwestie
Lijsten (list) zijn een van de basis ingebouwde gegevens typen in Python sinds de eerste versies van de taal. In de loop der tijd is hun interne structuur verbeterd, met name om de prestaties en het gemak van programmeren te verhogen.
Probleem
Het is belangrijk te begrijpen dat lijsten in Python niet zijn geïmplementeerd als gekoppelde lijsten, maar als dynamische arrays. Een verkeerde voorstelling leidt tot inefficiënte code of onjuiste berekeningen van de complexiteit van bewerkingen.
Oplossing
Lijsten zijn geïmplementeerd als dynamische arrays die, indien nodig, de grootte van het toegewezen geheugen "sprongetjes" (uitbreiden) om constante kosten bij het toevoegen van elementen te vermijden. Dit maakt het mogelijk om elementen aan het einde van de lijst in amortized O(1) tijd in te voegen of te verwijderen. Invoegen of verwijderen in het midden/begin vereist het verplaatsen van elementen, wat O(n) tijd kost.
Voorbeeldcode:
my_list = [1, 2, 3] my_list.append(4) # Toevoegen aan het einde my_list.insert(1, 'a') # Invoegen op index print(my_list)
Belangrijkste kenmerken:
Kan men een list in Python beschouwen als analoog aan een array in C? Wat is het verschil?
Nee, een array in C bevat elementen van een vast type, die aaneengeschakeld in het geheugen zijn geplaatst. Python list is een array van pointers naar objecten, elk verwijzend naar een zelfstandig object van willekeurig type in de heap.
Wat gebeurt er als je in een loop elementen aan het begin van de lijst invoegt? Is dat snel?
Nee, dat is traag: bij invoegen aan het begin (positie 0) worden bij elke invoeging alle bestaande elementen naar rechts verschoven. De amortized complexiteit is O(n) per bewerking, wat bij grotere lijsten leidt tot prestatieafname.
Wat is het verschil tussen de operatoren + en append/extend voor lijsten?
lst1 = [1, 2] lst2 = [3, 4] lst3 = lst1 + lst2 # lst3 — nieuwe lijst lst1.append(lst2) # lst1 wordt [1, 2, [3, 4]] lst1.extend(lst2) # lst1 wordt [1, 2, 3, 4], als lst1 niet is gereset na de vorige append
In een project werd een list gebruikt voor het opslaan en regelmatig verwijderen van de eerste elementen. We merkten aanzienlijke vertraging bij een grote hoeveelheid gegevens.
Voordelen:
Nadelen:
Na het identificeren van het probleem vervingen we de list door collections.deque, die is geoptimaliseerd voor dergelijke bewerkingen.
Voordelen:
Nadelen: