4 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
您的代碼的兩個(gè)版本都是矢量化的。您為嘗試向量化第二個(gè)版本而創(chuàng)建的數(shù)組只是開銷。
NumPy 向量化不是指硬件向量化。如果編譯器足夠聰明,它最終可能會(huì)使用硬件矢量化,但 NumPy 并沒有明確使用 AVX 或任何東西。
NumPy 向量化是指編寫一次對(duì)整個(gè)數(shù)組進(jìn)行操作的 Python 級(jí)代碼,而不是使用一次對(duì)多個(gè)操作數(shù)進(jìn)行操作的硬件指令。它是 Python 級(jí)別的向量化,而不是機(jī)器語(yǔ)言級(jí)別的向量化。與編寫顯式循環(huán)相比,這樣做的好處是 NumPy 可以在 C 級(jí)循環(huán)而不是 Python 中執(zhí)行工作,從而避免了大量的動(dòng)態(tài)調(diào)度、裝箱、拆箱、遍歷字節(jié)碼評(píng)估循環(huán)等。
從這個(gè)意義上說(shuō),您的代碼的兩個(gè)版本都是矢量化的,但是第二個(gè)版本在寫入和讀取巨大的數(shù)組時(shí)浪費(fèi)了大量?jī)?nèi)存和內(nèi)存帶寬。
此外,即使我們談?wù)摰氖怯布?jí)矢量化,該1 -
版本也與其他版本一樣適用于硬件級(jí)矢量化。您只需將標(biāo)量加載1
到向量寄存器的所有位置并正常進(jìn)行。與第二個(gè)版本相比,它涉及的內(nèi)存?zhèn)鬏斠俚枚?,因此可能仍然比第二個(gè)版本運(yùn)行得更快。

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
時(shí)間基本相同。正如其他人指出的那樣,沒有任何類型的硬件或多核并行化,只是解釋 Python 和編譯numpy函數(shù)的混合。
In [289]: x = np.ones((1000,1000))
In [290]: timeit 1-np.log(x)
15 ms ± 1.94 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [291]: timeit np.subtract(np.ones_like(x), np.log(x))
18.6 ms ± 1.89 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
取出np.ones_like定時(shí)循環(huán):
In [292]: %%timeit y = np.ones_like(x)
...: np.subtract(y,np.log(x))
...:
...:
15.7 ms ± 441 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2/3 的時(shí)間花在log函數(shù)上:
In [303]: timeit np.log(x)
10.7 ms ± 211 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [306]: %%timeit y=np.log(x)
...: np.subtract(1, y)
3.77 ms ± 5.16 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
生成方式的變化1只是時(shí)間的一小部分。
使用“廣播”,使用標(biāo)量和數(shù)組或數(shù)組和數(shù)組進(jìn)行數(shù)學(xué)運(yùn)算同樣容易。
,1無(wú)論是標(biāo)量(實(shí)際上是一個(gè)形狀為 的數(shù)組()),被廣播到 (1,1),然后到 (1000,1000),所有這些都沒有復(fù)制。

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊
我當(dāng)然不是 numpy 專家,但我的猜測(cè)是第一個(gè)例子只使用一個(gè)向量,第二個(gè)例子首先創(chuàng)建了一個(gè) 1 的向量,然后減去。后者需要雙倍的內(nèi)存和一個(gè)額外的步驟來(lái)創(chuàng)建 1 的向量。
在 x86 CPU 上,兩者都可能是某種 AVX 指令,一次可以處理 4 個(gè)數(shù)字。當(dāng)然,除非您使用的是 SIMD 寬度大于向量長(zhǎng)度的花哨 CPU,并且該 CPU 由 numpy 支持。

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
案例 A 在 mpu 上僅運(yùn)行一個(gè)迭代器,而案例 B 在兩個(gè)與 X 一樣大的向量上具有兩個(gè)迭代器,如果未優(yōu)化,則需要在線程中進(jìn)行大量上下文切換。案例 B 是案例 A 的更通用版本......
添加回答
舉報(bào)