[英]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.