Listor och NumPy-arrayer
Att välja rätt datastruktur kan ha stor inverkan på både hastighet och minnesanvändning. Låt oss först undersöka listor och jämföra dem med NumPy-arrayer för att förstå när och hur dessa datastrukturer används effektivt.
Lista
En list är en av de mest använda datatyperna. Den fungerar som en dynamisk array, vilket innebär att dess storlek kan öka eller minska vid behov. Listor är mångsidiga och erbjuder effektiv åtkomst och modifiering vid godtyckliga index. Dock kan operationer som att infoga eller ta bort element, samt att söka efter ett element (kontrollera medlemskap), bli långsamma för stora listor. Undantaget är infogning eller borttagning i slutet av listan, vilket förblir effektivt oavsett listans storlek.
Listor är ett bra val i följande situationer:
- Behov av ordnad data;
- Frekvent åtkomst eller modifiering av element via index;
- Behov av att lagra olika datatyper (t.ex. heltal, strängar eller egna objekt);
- Inget krav på snabb medlemskapstestning eller snabb infogning/borttagning i mitten av listan.
123456789101112131415my_list = [10, 20, 30] # Access an element by index print(my_list[1]) # Modify an element at a specific index my_list[1] = 50 print(my_list) # Insert an element at the end of the list my_list.append(40) print(my_list) # Remove an element from the end of the list my_list.pop() print(my_list)
NumPy-array
Även om listor är mångsidiga är de inte de mest effektiva för storskaliga numeriska operationer. Det är här NumPy-arrayer kommer in i bilden.
NumPy-arrayer är implementerade i C, vilket gör dem mycket snabbare än listor för numeriska operationer. En viktig faktor är vektorisering, som möjliggör operationer på hela arrayer samtidigt, utan behov av explicita loopar. Detta leder till betydande prestandaförbättringar, särskilt med stora datamängder.
Här är ett exempel på att kvadrera varje element i en lista (med en for-loop inom en list comprehension) och en NumPy-array (med vektorisering):
1234567891011121314151617181920import numpy as np import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator my_list = list(range(1, 100001)) arr = np.array(my_list) @timeit_decorator(number=100) def square_list(numbers_list): return [x ** 2 for x in numbers_list] @timeit_decorator(number=100) def square_array(numbers_array): return numbers_array ** 2 sqaures_list = square_list(my_list) squares_array = square_array(arr) if np.array_equal(squares_array, sqaures_list): print('The array is equal to the list')
Som du kan se är prestandafördelen med NumPy-arrayer tydlig.
Vid hantering av numerisk data erbjuder NumPy-arrayer en minnesfördel jämfört med listor. De lagrar faktisk data i sammanhängande minnesblock, vilket gör dem mer effektiva, särskilt för stora datamängder. Eftersom de är homogena (samma datatyp) undviker NumPy-arrayer den extra belastningen av objektreferenser.
Till skillnad från detta är listor heterogena och lagrar referenser till objekt i sammanhängande minne, medan de faktiska objekten lagras någon annanstans. Denna flexibilitet innebär ytterligare minnesbelastning vid arbete med numerisk data.
Sammanfattningsvis jämför följande tabell listor med NumPy-arrayer:
1. Du utvecklar ett program för att hantera en samling av Sensor-objekt (anpassad klass), där varje objekt innehåller en timestamp (sträng) och en reading (flyttal). Datamängden kommer att växa över tid och frekventa uppdateringar av enskilda sensorsavläsningar krävs. Vilken datastruktur är det bästa valet?
2. Du arbetar med en stor numerisk datamängd för ett maskininlärningsprojekt. Vilken datastruktur ger den mest effektiva prestandan för denna uppgift?
3. Du analyserar börsdata som består av numeriska värden (priser) över tid. Du behöver utföra snabba beräkningar, såsom att hitta medelpriset och tillämpa matematiska transformationer på datan. Vilken datastruktur skulle du välja?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Can you explain more about when to use lists versus NumPy arrays?
What are some common mistakes when choosing between lists and NumPy arrays?
Can you give more examples of operations that are faster with NumPy arrays?
Awesome!
Completion rate improved to 7.69
Listor och NumPy-arrayer
Svep för att visa menyn
Att välja rätt datastruktur kan ha stor inverkan på både hastighet och minnesanvändning. Låt oss först undersöka listor och jämföra dem med NumPy-arrayer för att förstå när och hur dessa datastrukturer används effektivt.
Lista
En list är en av de mest använda datatyperna. Den fungerar som en dynamisk array, vilket innebär att dess storlek kan öka eller minska vid behov. Listor är mångsidiga och erbjuder effektiv åtkomst och modifiering vid godtyckliga index. Dock kan operationer som att infoga eller ta bort element, samt att söka efter ett element (kontrollera medlemskap), bli långsamma för stora listor. Undantaget är infogning eller borttagning i slutet av listan, vilket förblir effektivt oavsett listans storlek.
Listor är ett bra val i följande situationer:
- Behov av ordnad data;
- Frekvent åtkomst eller modifiering av element via index;
- Behov av att lagra olika datatyper (t.ex. heltal, strängar eller egna objekt);
- Inget krav på snabb medlemskapstestning eller snabb infogning/borttagning i mitten av listan.
123456789101112131415my_list = [10, 20, 30] # Access an element by index print(my_list[1]) # Modify an element at a specific index my_list[1] = 50 print(my_list) # Insert an element at the end of the list my_list.append(40) print(my_list) # Remove an element from the end of the list my_list.pop() print(my_list)
NumPy-array
Även om listor är mångsidiga är de inte de mest effektiva för storskaliga numeriska operationer. Det är här NumPy-arrayer kommer in i bilden.
NumPy-arrayer är implementerade i C, vilket gör dem mycket snabbare än listor för numeriska operationer. En viktig faktor är vektorisering, som möjliggör operationer på hela arrayer samtidigt, utan behov av explicita loopar. Detta leder till betydande prestandaförbättringar, särskilt med stora datamängder.
Här är ett exempel på att kvadrera varje element i en lista (med en for-loop inom en list comprehension) och en NumPy-array (med vektorisering):
1234567891011121314151617181920import numpy as np import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator my_list = list(range(1, 100001)) arr = np.array(my_list) @timeit_decorator(number=100) def square_list(numbers_list): return [x ** 2 for x in numbers_list] @timeit_decorator(number=100) def square_array(numbers_array): return numbers_array ** 2 sqaures_list = square_list(my_list) squares_array = square_array(arr) if np.array_equal(squares_array, sqaures_list): print('The array is equal to the list')
Som du kan se är prestandafördelen med NumPy-arrayer tydlig.
Vid hantering av numerisk data erbjuder NumPy-arrayer en minnesfördel jämfört med listor. De lagrar faktisk data i sammanhängande minnesblock, vilket gör dem mer effektiva, särskilt för stora datamängder. Eftersom de är homogena (samma datatyp) undviker NumPy-arrayer den extra belastningen av objektreferenser.
Till skillnad från detta är listor heterogena och lagrar referenser till objekt i sammanhängande minne, medan de faktiska objekten lagras någon annanstans. Denna flexibilitet innebär ytterligare minnesbelastning vid arbete med numerisk data.
Sammanfattningsvis jämför följande tabell listor med NumPy-arrayer:
1. Du utvecklar ett program för att hantera en samling av Sensor-objekt (anpassad klass), där varje objekt innehåller en timestamp (sträng) och en reading (flyttal). Datamängden kommer att växa över tid och frekventa uppdateringar av enskilda sensorsavläsningar krävs. Vilken datastruktur är det bästa valet?
2. Du arbetar med en stor numerisk datamängd för ett maskininlärningsprojekt. Vilken datastruktur ger den mest effektiva prestandan för denna uppgift?
3. Du analyserar börsdata som består av numeriska värden (priser) över tid. Du behöver utföra snabba beräkningar, såsom att hitta medelpriset och tillämpa matematiska transformationer på datan. Vilken datastruktur skulle du välja?
Tack för dina kommentarer!