python numpy tolist()会增加多少开销?

2024-09-28 20:19:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的python程序使用numpyarray作为数组的标准数据类型。对于繁重的计算,我将数组传递给C++库。为此,我使用pybind。但是,我需要使用pythonlist。我通过以下方式从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.


Tags: the程序numpyadd标准方式数组list
2条回答

很多。对于简单的内置类型,可以在对象上使用sys.getsizeof来确定与该对象相关联的内存开销(对于容器,这不包括存储在其中的值,只包括用于存储它们的指针)。在

例如,100个smallish ints的list(但要避免小的int缓存大于256)是(在我的3.5.1 Windows x64安装上):

>>> sys.getsizeof([0] * 100) + sys.getsizeof(0) * 100
3264

或者大约需要3KB的内存。如果这些相同的值存储在numpyarrayint32中,没有每个数量的Python对象,也没有每个对象的指针,那么大小将下降到大约100*4(再加上几十个字节,对于array对象本身的开销),大约在500字节以下。每增加一个small int的增量成本是对象的24个字节(但是如果它在小int缓存中的值是-5到256个IIRC是免费的),在list中存储8个字节,总共32个字节,而C级类型是4个字节,大约是存储需求的8倍(而且您仍然在存储原始对象)。在

如果你有足够的记忆来处理它,那就随它去吧。但否则,您可能会尝试寻找一个包装,它允许您传入缓冲区协议支持对象(Py3上的numpy.arrayarray.array,通过memoryview切片分配填充的ctypes数组,等等),因此不需要转换为Python级别的类型。在

是的,会是新的。数组的数据布局与列表的数据布局非常不同。在

数组具有shape和stripes之类的属性,以及一个包含元素的1d数据缓冲区(只是一组连续的字节)。其他属性和代码将它们视为float、int、strings、1d、2d等

列表是指针的缓冲区,每个指针都指向内存中其他位置的对象。它可以指向一个数字、一个字符串或另一个列表。它不会指向数组的数据缓冲区或其中的元素。在

有使用编译代码的numpy数组和利用数组数据缓冲区的C数组的接口。cython是上的公共项。关于numpy的capi还有一个完整的文档部分。{cd2>什么都知道。如果它需要一个列表接口,它可能不是最好的。在

当我用^{做了timeit测试时,它似乎没有那么贵。在

======================

但是看看pybind11github,我发现有很多引用numpy,而这个

http://pybind11.readthedocs.io/en/latest/advanced.html#numpy-support

文档页。它支持缓冲区协议和numpy数组。因此,您不必执行tolist步骤。在

#include <pybind11/numpy.h>
void f(py::array_t<double> array);

相关问题 更多 >