我不確定為什么比較切片的 numpy 陣列使用,比][. 例如:
start = time.time()
a = np.zeros((100,100))
for _ in range(1000000):
a[1:99][1:99] == 1
print(time.time() - start)
start = time.time()
a = np.zeros((100,100))
for _ in range(1000000):
a[1:99, 1:99] == 1
print(time.time() - start)
3.2756259441375732
11.044903039932251
差了 3 倍多。使用 的時間測量大致相同timeit。
我正在研究遞回演算法(我打算這樣做),這些問題使我的程式運行速度變慢,從大約 1 秒增加到 10 秒。我只想知道他們背后的原因。可能這是一個錯誤。我正在使用 Python 3.9.9。謝謝。
uj5u.com熱心網友回復:
第一個與a[2:99]==1. 一個 (98,100) 切片后跟一個 (97,100),然后是 == 測驗。
In [177]: timeit (a[1:99][1:99]==1)
8.51 μs ± 16.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [178]: timeit (a[1:99][1:99])
383 ns ± 5.73 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [179]: timeit (a[1:99])
208 ns ± 10.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
大部分時間是測驗,而不是切片。
In [180]: a[1:99,1:99].shape
Out[180]: (98, 98)
In [181]: timeit a[1:99,1:99]==1
32.2 μs ± 12.9 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [182]: timeit a[1:99,1:99]
301 ns ± 3.61 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
同樣,切片是計時的一小部分,但==測驗速度要慢得多。在第一種情況下,我們選擇了行的子集,因此測驗在資料緩沖區的連續塊上進行。在第二個中,我們選擇行和列的子集。通過資料緩沖區的迭代更為復雜。
我們可以通過測驗一段列與一段行來簡化比較:
In [183]: timeit a[:,2:99]==1
32.3 μs ± 13.8 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [184]: timeit a[2:99,:]==1
8.58 μs ± 10.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
作為進一步的測驗,使用“F”順序創建一個新陣列。現在“行”是慢切片
In [189]: b = np.array(a, order='F')
In [190]: timeit b[:,2:99]==1
8.83 μs ± 20.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [191]: timeit b[2:99,:]==1
32.8 μs ± 31.2 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
===
但是你為什么要比較這兩個切片,一個是 (97,100) 陣列,另一個是 (98,98)。他們正在挑選a.
我想知道您是否真的打算測驗連續的行、列切片,而不是兩行切片。
In [193]: timeit (a[1:99][:,1:99]==1)
32.6 μs ± 92.4 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
僅比較切片,我們發現順序切片更慢 - 只是一點點。
In [194]: timeit (a[1:99][:,1:99])
472 ns ± 3.76 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [195]: timeit (a[1:99,1:99])
306 ns ± 3.19 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/389932.html
