簡體   English   中英

python numpy tolist()增加多少開銷?

[英]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的內存。 如果將這些相同的值存儲在int32numpy array中,每個數字都沒有Python對象,也沒有每個對象指針,那么大小將下降到大約100 * 4(加上另外幾十個字節,用於array對象開銷本身) ,小於500字節。 對象的每個附加小int的增量成本為24字節(盡管如果它位於小int高速緩存中,其值從-5到256 IIRC,則是免費的), list的存儲為8字節,總計32字節,而C級類型的。4,大約是存儲需求的8倍(並且您仍在存儲原始對象)。

如果您有足夠的內存來處理它,那就這樣吧。 但是否則,您可能會嘗試查看一個包裝,該包裝使您可以傳遞支持對象的緩沖區協議(Py3上的numpy.arrayarray.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.

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