簡體   English   中英

numpy 數組賦值比 python 列表慢

[英]numpy array assignment is slower than python list

麻木-

arr = np.array([[1, 2, 3, 4]])
row = np.array([1, 2, 3, 4])
%timeit arr[0] = row
466 ns ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

蟒蛇列表 -

arr = [[1, 2, 3, 4]]
row = [1, 2, 3, 4]
%timeit arr[0] = row
59.3 ns ± 2.94 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each

numpy 不應該是這里更快的版本嗎?


這就是我的目標——

arr = np.empty((150, 4))

while True:
     row = get_row_from_api() 
     arr[-1] = row

是的,以這種方式使用 python 列表肯定會更快,因為當您將某些內容分配給 python 列表元素時,它不會被復制,只是重新分配了一些引用( https://developers.google.com/edu/python/lists )。 相反,Numpy 將所有元素從源容器復制到目標容器。 我不確定這里是否需要 numpy 數組,因為它們的創建不是免費的,而且 python 列表在創建時並沒有那么慢(正如我們在賦值時看到的那樣)。

這兩種操作的底層語義非常不同。 Python 列表是引用數組。 Numpy 數組是數據本身的數組。

row = get_row_from_api()表示已經分配了一個新列表。

將列表分配為lst[-1] = row只是將地址寫入lst 這通常是 4 或 8 個字節。

將數組作為arr[i] = row放入是復制數據。 這是arr[i, :] = row的簡寫。 row每個元素都被復制到arr的緩沖區。 如果row是一個列表,那么從 python 對象轉換為本機數字類型會產生額外的開銷。

請記住,過早的優化是沒有意義的。 與另一種方法相比,您為一種方法節省的時間可能可以忽略不計。 同時,如果您稍后需要一個數組,那么預先分配並降低速度可能會更快,而不是在最終列表中調用np.array 在前一種情況下,您分配一個預定大小和 dtype 的緩沖區。 在后者中,您只是推遲了復制數據的開銷,但也產生了必須確定數組大小和 dtype 的開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM