[英]How much overhead does python numpy tolist() add?
我正在使用一個python程序,該程序使用numpy數組作為數組的標准數據類型。 對於繁重的計算,我將數組傳遞給C ++庫。 為了做到這一點,我使用pybind 。 但是,我需要使用python list
。 我通過以下方式從numpy
數組和list
進行轉換:
NativeSolver.vector_add(array1.tolist(), array2.tolist(), ...)
此轉換會產生多少開銷? 我希望它不會創建一個全新的副本。 numpy參考說:
ndarray.tolist()
返回數組數據的副本作為(嵌套的)Python列表。 數據項將轉換為最兼容的Python類型。
很多。 對於簡單的內置類型,可以在對象上使用sys.getsizeof
來確定與該對象關聯的內存開銷(對於容器,這不包括存儲在其中的值,僅包括用於存儲它們的指針)。
因此,例如,在我的3.5.1 Windows x64安裝上,有一個100個較小的int
list
(但大於256個以避免小int
緩存):
>>> sys.getsizeof([0] * 100) + sys.getsizeof(0) * 100
3264
或大約需要3 KB的內存。 如果將這些相同的值存儲在int32
的numpy
array
中,每個數字都沒有Python對象,也沒有每個對象指針,那么大小將下降到大約100 * 4(加上另外幾十個字節,用於array
對象開銷本身) ,小於500字節。 對象的每個附加小int
的增量成本為24字節(盡管如果它位於小int高速緩存中,其值從-5到256 IIRC,則是免費的), list
的存儲為8字節,總計32字節,而C級類型的。4,大約是存儲需求的8倍(並且您仍在存儲原始對象)。
如果您有足夠的內存來處理它,那就這樣吧。 但是否則,您可能會嘗試查看一個包裝,該包裝使您可以傳遞支持對象的緩沖區協議(Py3上的numpy.array
, array.array
,通過memoryview slice分配填充的ctypes
數組等),因此不會轉換為Python級別類型需要。
是的,它將是新副本。 數組的數據布局與列表的數據布局有很大不同。
數組具有形狀和步幅等屬性,以及包含元素的一維數據緩沖區-只是一組連續的字節。 其他屬性和代碼將它們視為浮點數,整數,字符串,1d,2d等。
列表是指針的緩沖區,每個指針都指向對象在內存中的其他位置。 它可能指向數字,字符串或其他列表。 它不會指向數組的數據緩沖區或其中的元素。
有一些numpy數組與已編譯的代碼以及使用數組數據緩沖區的C數組連接。 cython
很常見。 關於numpy的C API,還有一個完整的文檔部分。 我對pbind
。 如果需要列表接口,可能不是最好的。
當我使用tolist()
完成timeit
測試時,它似乎並不那么昂貴。
=======================
但是看着pybind11
github我發現了一些對numpy
的引用,這
http://pybind11.readthedocs.io/zh-CN/latest/advanced.html#numpy-support
文檔頁面。 它支持緩沖區協議和numpy數組。 因此,您不必執行tolist
步驟。
#include <pybind11/numpy.h>
void f(py::array_t<double> array);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.