Listat ja NumPy-taulukot
Oikean tietorakenteen valinta voi vaikuttaa merkittävästi sekä suoritusnopeuteen että muistin käyttöön. Tarkastellaan ensin listoja ja verrataan niitä NumPy-taulukoihin, jotta ymmärrämme, milloin ja miten näitä tietorakenteita kannattaa käyttää tehokkaasti.
Lista
list on yksi yleisimmin käytetyistä tietotyypeistä. Se toimii dynaamisena taulukkona, eli sen koko voi kasvaa tai pienentyä tarpeen mukaan. Listat ovat monipuolisia ja tarjoavat tehokkaan pääsyn ja muokkauksen mihin tahansa indeksiin. Kuitenkin toiminnot, kuten alkioiden lisääminen tai poistaminen sekä jäsenyyden tarkistaminen, voivat hidastua suurilla listoilla. Poikkeuksena on lisäys tai poisto listan lopusta, joka pysyy tehokkaana listan koosta riippumatta.
Listojen käyttö on hyvä valinta seuraavissa tilanteissa:
- Tarvitset järjestettyä dataa;
- Pääset usein käsiksi alkioihin tai muokkaat niitä indeksin perusteella;
- Sinun täytyy tallentaa eri tietotyyppejä (esim. kokonaislukuja, merkkijonoja tai omia olioita);
- Et tarvitse nopeaa jäsenyyden tarkistusta tai nopeaa lisäämistä/poistamista listan keskeltä.
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-taulukko
Vaikka listat ovat monipuolisia, ne eivät ole tehokkaimpia suurten numeeristen operaatioiden käsittelyyn. Tässä kohtaa NumPy-taulukot ovat hyödyllisiä.
NumPy-taulukot on toteutettu C-kielellä, mikä tekee niistä huomattavasti nopeampia kuin listat numeerisissa operaatioissa. Keskeinen tekijä on vektorointi, jonka avulla operaatioita voidaan suorittaa koko taulukolle kerralla ilman eksplisiittisiä silmukoita. Tämä johtaa merkittäviin suorituskykyparannuksiin erityisesti suurten tietomassojen kanssa.
Tarkastellaan esimerkkiä, jossa jokainen alkio korotetaan toiseen potenssiin listassa (list comprehension -rakenteen sisällä olevan for-silmukan avulla) ja NumPy-taulukossa (vektoroinnin avulla):
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')
Kuten huomaat, NumPy-taulukoiden suorituskykyetu on varsin selvä.
Kun käsitellään numeerista dataa, NumPy-taulukot tarjoavat muistiedun listoihin verrattuna. Ne tallentavat varsinaisen datan yhtenäisiin muistilohkoihin, mikä tekee niistä tehokkaampia erityisesti suurten tietomäärien kanssa. Koska NumPy-taulukot ovat homogeenisia (sama tietotyyppi), ne välttävät viite-olioiden aiheuttaman ylikuorman.
Sen sijaan listat ovat heterogeenisia ja tallentavat viitteitä olioihin yhtenäisessä muistissa, mutta varsinaiset oliot sijaitsevat muualla. Tämä joustavuus aiheuttaa lisämuistikuormaa numeerisen datan käsittelyssä.
Yhteenvetona seuraava taulukko vertailee listoja ja NumPy-taulukoita:
1. Kehität ohjelmaa, jolla hallitaan joukkoa Sensor-olioita (oma luokka), joista jokaisella on timestamp (merkkijono) ja reading (liukuluku). Aineisto kasvaa ajan myötä, ja yksittäisten sensorilukemien päivityksiä tehdään usein. Mikä tietorakenne olisi paras valinta?
2. Työskentelet suuren numeerisen aineiston kanssa koneoppimisprojektissa. Mikä tietorakenne tarjoaa tehokkaimman suorituskyvyn tähän tehtävään?
3. Analysoit pörssidataa, joka koostuu numeerisista arvoista (hinnoista) ajan suhteen. Sinun täytyy suorittaa nopeita laskutoimituksia, kuten keskihinnan laskeminen ja matemaattisten muunnosten tekeminen aineistolle. Minkä tietorakenteen valitsisit?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 7.69
Listat ja NumPy-taulukot
Pyyhkäise näyttääksesi valikon
Oikean tietorakenteen valinta voi vaikuttaa merkittävästi sekä suoritusnopeuteen että muistin käyttöön. Tarkastellaan ensin listoja ja verrataan niitä NumPy-taulukoihin, jotta ymmärrämme, milloin ja miten näitä tietorakenteita kannattaa käyttää tehokkaasti.
Lista
list on yksi yleisimmin käytetyistä tietotyypeistä. Se toimii dynaamisena taulukkona, eli sen koko voi kasvaa tai pienentyä tarpeen mukaan. Listat ovat monipuolisia ja tarjoavat tehokkaan pääsyn ja muokkauksen mihin tahansa indeksiin. Kuitenkin toiminnot, kuten alkioiden lisääminen tai poistaminen sekä jäsenyyden tarkistaminen, voivat hidastua suurilla listoilla. Poikkeuksena on lisäys tai poisto listan lopusta, joka pysyy tehokkaana listan koosta riippumatta.
Listojen käyttö on hyvä valinta seuraavissa tilanteissa:
- Tarvitset järjestettyä dataa;
- Pääset usein käsiksi alkioihin tai muokkaat niitä indeksin perusteella;
- Sinun täytyy tallentaa eri tietotyyppejä (esim. kokonaislukuja, merkkijonoja tai omia olioita);
- Et tarvitse nopeaa jäsenyyden tarkistusta tai nopeaa lisäämistä/poistamista listan keskeltä.
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-taulukko
Vaikka listat ovat monipuolisia, ne eivät ole tehokkaimpia suurten numeeristen operaatioiden käsittelyyn. Tässä kohtaa NumPy-taulukot ovat hyödyllisiä.
NumPy-taulukot on toteutettu C-kielellä, mikä tekee niistä huomattavasti nopeampia kuin listat numeerisissa operaatioissa. Keskeinen tekijä on vektorointi, jonka avulla operaatioita voidaan suorittaa koko taulukolle kerralla ilman eksplisiittisiä silmukoita. Tämä johtaa merkittäviin suorituskykyparannuksiin erityisesti suurten tietomassojen kanssa.
Tarkastellaan esimerkkiä, jossa jokainen alkio korotetaan toiseen potenssiin listassa (list comprehension -rakenteen sisällä olevan for-silmukan avulla) ja NumPy-taulukossa (vektoroinnin avulla):
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')
Kuten huomaat, NumPy-taulukoiden suorituskykyetu on varsin selvä.
Kun käsitellään numeerista dataa, NumPy-taulukot tarjoavat muistiedun listoihin verrattuna. Ne tallentavat varsinaisen datan yhtenäisiin muistilohkoihin, mikä tekee niistä tehokkaampia erityisesti suurten tietomäärien kanssa. Koska NumPy-taulukot ovat homogeenisia (sama tietotyyppi), ne välttävät viite-olioiden aiheuttaman ylikuorman.
Sen sijaan listat ovat heterogeenisia ja tallentavat viitteitä olioihin yhtenäisessä muistissa, mutta varsinaiset oliot sijaitsevat muualla. Tämä joustavuus aiheuttaa lisämuistikuormaa numeerisen datan käsittelyssä.
Yhteenvetona seuraava taulukko vertailee listoja ja NumPy-taulukoita:
1. Kehität ohjelmaa, jolla hallitaan joukkoa Sensor-olioita (oma luokka), joista jokaisella on timestamp (merkkijono) ja reading (liukuluku). Aineisto kasvaa ajan myötä, ja yksittäisten sensorilukemien päivityksiä tehdään usein. Mikä tietorakenne olisi paras valinta?
2. Työskentelet suuren numeerisen aineiston kanssa koneoppimisprojektissa. Mikä tietorakenne tarjoaa tehokkaimman suorituskyvyn tähän tehtävään?
3. Analysoit pörssidataa, joka koostuu numeerisista arvoista (hinnoista) ajan suhteen. Sinun täytyy suorittaa nopeita laskutoimituksia, kuten keskihinnan laskeminen ja matemaattisten muunnosten tekeminen aineistolle. Minkä tietorakenteen valitsisit?
Kiitos palautteestasi!