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

标签 python c++ arrays numpy wrapper

我正在使用一个 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 个小 intlist(但大于 256 以避免小的 int 缓存)是(在我的3.5.1 Windows x64 安装):

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

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

如果你有足够的内存来处理它,那就这样吧。但除此之外,您可能会尝试查看一种包装,它可以让您传入缓冲协议(protocol)支持对象(numpy.arrayarray.array on Py3、ctypes 数组通过 memoryview 切片分配等填充),因此不需要转换为 Python 级别类型。

关于python - python numpy tolist() 增加了多少开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39523210/

相关文章:

python - 用该列的平均值替换 Pandas 数据框中的列

python - Django 自定义管理器返回排序

C++ - 为动态字符串数组创建不带 = 赋值的复制函数

Java:返回两个 "immutable"整数的最佳方式?

python - App 引擎中的记录器实体

python - GridSearchCV 在管道中将 fit_params 传递给 XGBRegressor 产生 "ValueError: need more than 1 value to unpack"

c++ - 使用非 bool 返回值重载相等比较时,C++20 中的重大变化或 clang-trunk/gcc-trunk 中的回归?

c++ - 关于STL仿函数的使用,更大的<T>

ruby-on-rails - 在 Rails 中如何使用带索引的 find_each 方法?

javascript - 返回的 AJAX 数组未被复制到数组