В началото на програмирането имах невероятната идея, че трябва да науча Java, за да ми е по-лесно да науча JavaScript. Очевидно това беше погрешно. Бързо напред 2 години, видях някой да пита какви са разликите между Java и JavaScript. Отговорът: „Това е като кола и килим.“ Можете да намерите въпроса тук. За щастие, списъците и масивите поддържат много по-тясна и по-малко сложна връзка. Нека да започнем.

Прилики

Python има вградени списъци, но му липсват масиви. За да работите с масиви, трябва да използвате библиотека. Предпочитам да използвам Numpy. Нека създадем празен списък и празен масив.

import numpy as np
lst = []
array = np.array([])

Може би си мислите: „Грешно сте написали списък“. Списъкът с думи обаче е ключова дума на Python, така че не е подходящо да се използва. Тъй като python няма ключова дума за масив, няма проблеми там. И списъците, и масивите работят по подобен начин, нека да разгледаме следния пример.

lst.extend([1,2,3,4,5,'six'])
array = np.append(array,[1,2,3,4,5,'six'])
lst.remove('six')
array = np.delete(array,-1)
lst.append(6)
array = np.append(array,6)

Тези основни операции се извършват по подобен начин. Например, за да добавите друг списък към списък на Python, трябва да използвате метода extend. В масива трябва да използвате метода за добавяне от Numpy. В Numpy обаче тази операция връща копие на масива, така че трябва да го зададете на нова променлива. Както масивите, така и списъците могат да съхраняват различни типове данни. Например, съхранихме заедно цели числа и низ. Това не е границата. Можете да съхранявате плаващи числа, низове, цели числа, списъци и масиви, наред с други неща. Освен добавяне на данни, можете да премахвате данни по различни начини. Можете да премахвате данни по индекс, чрез съвпадение на стойността и чрез нарязване. В този пример премахнахме стойността „шест“ с помощта на метода за изтриване в Numpy и използвахме метода за премахване от нашия списък. В масива премахнахме стойността, използвайки неговия индекс, а в нашия списък премахнахме стойността, като я съпоставихме. Ако искаме да добавим една стойност към нашия списък и масив, тогава можем да използваме метода append и за двете. Може би се чудите защо не използваме extend в нашия пример за списък. Причината е, че append добавя една единствена стойност. Ако преминем към добавяне на списък, като например в begging, тогава python ще добави списъка като стойност. Ще имате списък в списъка. Въпреки това, когато използвате extend, python ще вземе стойностите от списъка и ще ги добави поотделно. Това са някои от подобните неща, които можете да правите с python list и Numpy масиви. Няколко неща може да изискват допълнителна стъпка или две, но в крайна сметка се прави същото.

Разлика

Разликите между масиви и списък са малко, но са много важни. Нека разгледаме следния пример, за да проучим разликата.

import numpy as np
import sys
lst = list(range(0,9000000))
array = np.array(range(0,9000000))
print(sys.getsizeof(lst))
print(sys.getsizeof(array))
81000120
72000096

Първата разлика е, че масивите трябва да бъдат дедекларирани. Масивите не са вградени в списъците като Python, така че имате нужда от библиотека, която се справя с това вместо вас. Numpy е библиотека, която обработва масиви, така че е популярен избор при работа с масиви. В този пример използваме генератор за създаване на списък, така че трябва да декларираме списък. Можете обаче да създадете списък, като използвате квадратни скоби. В повечето случаи не е необходимо да използвате ключовата дума list. Втората разлика е размерът. Имаме списък и масив от 9 милиона стойности. Списъкът използва повече памет от масива. Ако имате работа с голямо количество стойности, тогава е по-добре да използвате масиви. Сега нека да разгледаме следващия пример.

import numpy as np
import time
array = np.array(range(0,9000000))
lst = list(range(0,9000000))
#Multiplying array by 3
start = time.time()
array_product = array - 2
end = time.time()
print(end - start)
#Multiplying list by 3
start = time.time()
lst_product = []
for i in lst:
    lst_product.append(i*3)
end = time.time()
print(end - start)
0.026592016220092773
0.520759105682373

В този пример се опитваме да умножим създадения от нас списък и масив по 3. Масивите Numpy имат вградена функционалност, която им позволява да умножават, делят, изваждат и добавят числа към всяка стойност. Накратко, можете да извършвате математически операции с масиви. Списъците са различни, защото не поддържат тези функции. Трябва да използвате разбиране на списък или for цикъл, за да извършите същите операции. Освен това можете да видите, че масивите извършват тези изчисления само за 4% от времето, необходимо за извършване на същото изчисление с помощта на разбиране на списък.

Заключение

Списъците и масивите са много сходни. Те имат почти същата функционалност, но имат някои основни разлики. Всеки от тях се представя по-добре в определени ситуации. И така, кога трябва да се използва всеки от тях? Масивите трябва да се използват, когато ще работите с голямо количество стойности или ако ще извършвате математически операции върху тези стойности. В противен случай списъци ще са достатъчни.