我使用的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.
很多。对于简单的内置类型,可以在对象上使用
sys.getsizeof
来确定与该对象相关联的内存开销(对于容器,这不包括存储在其中的值,只包括用于存储它们的指针)。在例如,100个smallish
int
s的list
(但要避免小的int
缓存大于256)是(在我的3.5.1 Windows x64安装上):或者大约需要3KB的内存。如果这些相同的值存储在
numpy
array
的int32
中,没有每个数量的Python对象,也没有每个对象的指针,那么大小将下降到大约100*4(再加上几十个字节,对于array
对象本身的开销),大约在500字节以下。每增加一个smallint
的增量成本是对象的24个字节(但是如果它在小int缓存中的值是-5到256个IIRC是免费的),在list
中存储8个字节,总共32个字节,而C级类型是4个字节,大约是存储需求的8倍(而且您仍然在存储原始对象)。在如果你有足够的记忆来处理它,那就随它去吧。但否则,您可能会尝试寻找一个包装,它允许您传入缓冲区协议支持对象(Py3上的
numpy.array
,array.array
,通过memoryview切片分配填充的ctypes
数组,等等),因此不需要转换为Python级别的类型。在是的,会是新的。数组的数据布局与列表的数据布局非常不同。在
数组具有shape和stripes之类的属性,以及一个包含元素的1d数据缓冲区(只是一组连续的字节)。其他属性和代码将它们视为float、int、strings、1d、2d等
列表是指针的缓冲区,每个指针都指向内存中其他位置的对象。它可以指向一个数字、一个字符串或另一个列表。它不会指向数组的数据缓冲区或其中的元素。在
有使用编译代码的numpy数组和利用数组数据缓冲区的C数组的接口。
cython
是上的公共项。关于numpy的capi还有一个完整的文档部分。{cd2>什么都知道。如果它需要一个列表接口,它可能不是最好的。在当我用^{做了
timeit
测试时,它似乎没有那么贵。在======================
但是看看
pybind11
github,我发现有很多引用numpy
,而这个http://pybind11.readthedocs.io/en/latest/advanced.html#numpy-support
文档页。它支持缓冲区协议和numpy数组。因此,您不必执行
tolist
步骤。在相关问题 更多 >
编程相关推荐