=
[]
for
i
in
range
(
len
(
a
)):
c
.
append
(
a
[
i
]
*
b
[
i
])
Bu to'g'ri javobni beradi, lekin agar
a
va
b
har birida millionlab raqamlar bo'lsa,
biz Python-da loopning samarasizligi uchun to'laymiz. Xuddi shu vazifani C tilida
yozish orqali tezroq bajarishimiz mumkin (aniqlik uchun biz o'zgaruvchan
deklaratsiyalar
va ishga tushirishlarni, xotirani ajratishni va hokazolarni e'tiborsiz
qoldiramiz).
for
(
i
=
0
;
i
<
rows
;
i
++
):
{
c
[
i
]
=
a
[
i
]
*
b
[
i
];
}
Bu Python kodini sharhlash va Python obyektlarini manipulyatsiya qilish
bilan bog'liq barcha xarajatlarni tejaydi, lekin Python-da kodlashdan olingan foyda
hisobiga. Bundan tashqari, talab qilinadigan kodlash ishi ma'lumotlarimizning
o'lchamlari bilan ortadi. Masalan, 2-D massivda C kodi (avvalgidek qisqartirilgan)
kengayadi.
for
(
i
=
0
;
i
<
rows
;
i
++
):
{
for
(
j
=
0
;
j
<
columns
;
j
++
):
{
c
[
i
][
j
]
=
a
[
i
][
j
]
*
b
[
i
][
j
];
}
}
NumPy
bizga
har
ikki
dunyoning
eng
yaxshisini
beradi:
ndarray
ishtirok etganda element bo'yicha operatsiyalar "standart rejim"
bo'ladi , lekin element bo'yicha operatsiya oldindan
tuzilgan C kodi orqali tez
bajariladi. NumPy ichida
c
=
a
*
b
oldingi misollar bajaradigan ishni C darajasiga yaqin tezlikda bajaradi, lekin
kodning soddaligi bilan biz Python-ga asoslangan narsadan kutamiz. Darhaqiqat,
3
NumPy idiomasi yanada sodda! Ushbu oxirgi misol NumPy-ning ko'p quvvatining
asosi bo'lgan ikkita xususiyatini ko'rsatadi: vektorizatsiya va eshittirish.
Nima uchun NumPy tez?
Vektorlashtirish kodda
hech qanday aniq aylanish, indeksatsiya va
hokazolarning yo'qligini tavsiflaydi - bu narsalar, albatta,
optimallashtirilgan,
oldindan tuzilgan C kodida "sahna ortida" sodir bo'ladi. Vektorlashtirilgan kod juda
ko'p afzalliklarga ega, ular orasida:
vektorlashtirilgan kod qisqaroq va o'qish osonroq
kamroq kod satrlari odatda kamroq xatolarni bildiradi
kod standart matematik belgilarga ko'proq o'xshaydi (odatda, matematik
konstruktsiyalarni to'g'ri kodlashni osonlashtiradi)
vektorlashtirish
natijasida
ko'proq
"Pythonik"
kod
paydo
bo'ladi. Vektorizatsiyasiz bizning kodimiz samarasiz va o'qish qiyin
bo'lgan
for
tsikllar bilan to'lib toshgan bo'lar edi .
Broadcasting - bu operatsiyalarning yashirin
element-element harakatini
tavsiflash uchun ishlatiladigan atama; Umuman olganda, NumPy da barcha
operatsiyalar,
nafaqat arifmetik amallar, balki mantiqiy, bitli, funktsional va
hokazolar ham shu yashirin elementma-element
rejimida harakat qiladi, ya'ni
translyatsiya qiladi. Bundan tashqari, yuqoridagi misol,
a
va
b
kichik
array bunday
katta shakliga "kengayadigan", deb taqdim ko'p qirrali shu shaklda suhbat yoki
skalar va array yoki turli shakl bilan ham ikki tillo, bo'lishi mumkin natijada olingan
translyatsiyaning bir ma'noli bo'lishining usuli. Eshittirishning batafsil “qoidalari”
uchun
basics.broadcasting
ga qarang .
Yana kim NumPy dan foydalanadi?
NumPy yana
ndarray
dan boshlab, ob'ektga yo'naltirilgan yondashuvni to'liq
qo'llab-quvvatlaydi . Masalan,
ndarray
ko'plab usullar va atributlarga ega bo'lgan
sinfdir. Uning ko'pgina usullari eng tashqi NumPy nom maydonidagi funktsiyalar
bilan aks ettirilgan bo'lib, dasturchiga o'zlari afzal ko'rgan
paradigmada kodlash
imkonini
beradi. Ushbu
moslashuvchanlik
NumPy
massiv
dialekti
va
NumPy
ndarray
sinfiga Pythonda qo'llaniladigan ko'p o'lchovli ma'lumotlar
almashinuvining
de-fakto
tiliga aylanishiga imkon berdi .