我寫了一些代碼
batch = np.ones([4, 3, 224, 224], dtype="float32")
import time
s = time.time()
batch_bytes = batch.tobytes()
e = time.time()
print(f"{(e-s)*1e3} ms")
這給出了輸出 2.2954940795898438 ms
看來成本不小,我猜這個方法是復制資料位元組吧?
我以前以為資料是按位元組存盤在記憶體中的,所以有辦法直接獲取嗎?
那么是否有可能更有效地獲取位元組?
uj5u.com熱心網友回復:
是的,它制作了一個副本,因為該bytes型別必須擁有其原始資料的所有權(即副本是強制性的)。但是,您可以使用以下命令查看沒有任何副本的 Numpy 陣列:
batch_bytes = batch.reshape(-1).view(np.uint8)
請注意,如果不同,則生成的型別(一維 Numpy 陣列)。
uj5u.com熱心網友回復:
是的 ndarray.tobytes() 創建資料的副本并將其存盤在計算機記憶體中的不同位置。這也在 NumPy 的檔案https://numpy.org/doc/stable/reference/generated/numpy.ndarray.tobytes.html中進行了描述
您可以通過列印物件的記憶體地址輕松地對此進行測驗。
import numpy as np
import time
batch = np.ones([4, 3, 224, 224], dtype="float32")
s = time.time()
batch_bytes = batch.tobytes()
e = time.time()
print(f"{(e-s)*1e3} ms")
print(f"Batch object address: {hex(id(batch))}")
print(f"batch_bytes object address: {hex(id(batch_bytes))}")
給出以下輸出:
Batch object address: 0x7f16beab0990
batch_bytes object address: 0x7f16be491010
uj5u.com熱心網友回復:
此處發布了相同的問題:Numpy array: get the raw bytes without copying
要從 中獲取位元組array:ndarray,使用array.data將獲取位元組的 memoryview(reference)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/414383.html
標籤:
上一篇:GoogleCloudFunctions上的Numpy錯誤不會在本地發生
下一篇:矩陣和張量的產生
