我正在使用一个 python 程序,该程序使用 numpy 数组作为数组的标准数据类型。对于繁重的计算,我将数组传递给 C++ 库。为此,我使用 pybind .但是,我需要使用 python list
。我通过以下方式从 numpy
数组和 list
进行转换:
NativeSolver.vector_add(array1.tolist(), array2.tolist(), ...)
此转换会产生多少开销?我希望它不会创建一个全新的拷贝。 Numpy 引用资料说:
ndarray.tolist()
Return a copy of the array data as a (nested) Python list. Data items are converted to the nearest compatible Python type.
最佳答案
很多。对于简单的内置类型,您可以在对象上使用 sys.getsizeof
来确定与该对象关联的内存开销(对于容器,这不包括存储在其中的值,仅包括使用的指针存储它们)。
例如,一个包含 100 个小 int
的 list
(但大于 256 以避免小的 int
缓存)是(在我的3.5.1 Windows x64 安装):
>>> sys.getsizeof([0] * 100) + sys.getsizeof(0) * 100
3264
或大约需要 3 KB 的内存。如果这些相同的值存储在 int32
的 numpy
array
中,没有每个数字的 Python 对象,也没有每个对象的指针,大小将下降到大约 100 * 4(加上另外几十个字节,用于 array
对象本身的开销),低于 500 字节。每个额外的 small int
对象的增量成本是 24 字节(尽管如果它在 small int 缓存中用于从 -5 到 256 IIRC 的值,它是免费的),并且 8 字节用于存储在list
,总共 32 个字节,而 C 级类型为 4 个字节,大约是存储要求的 8 倍(而且您仍在存储原始对象)。
如果你有足够的内存来处理它,那就这样吧。但除此之外,您可能会尝试查看一种包装,它可以让您传入缓冲协议(protocol)支持对象(numpy.array
、array.array
on Py3、ctypes
数组通过 memoryview 切片分配等填充),因此不需要转换为 Python 级别类型。
关于python - python numpy tolist() 增加了多少开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39523210/