Сколько памяти используется базовым буфером широковещательного массива numpy? - PullRequest
0 голосов
/ 07 февраля 2020

Обратите внимание, что nbytes не предоставляет правильное значение. Например:

>>> n = 1000
>>> x = np.arange(n)
>>> bx = np.broadcast_to(x, (int(1e15), n))
>>> bx.nbytes
8e18

.... который, вероятно, требует больше оперативной памяти, чем существует на Земле.

РЕДАКТИРОВАТЬ: Более конкретно, есть ли способ получить размер буфера, на который ссылается bx? Что-то вроде:

>>> x.nbytes
8000
>>> bx.underlying_buffer_size()
8000

1 Ответ

1 голос
/ 07 февраля 2020

Обратите внимание, что, как видно из документов, broadcast_to возвращает представление, где широковещательный массив может ссылаться на одну ячейку памяти из документов :

broadcast: array Представление только для чтения исходного массива с заданной формой. Это обычно не смежно. Кроме того, более одного элемента широковещательного массива может ссылаться на одну ячейку памяти.

Следовательно, в этом случае все новые строки указывают на одну и ту же ячейку памяти.

In Чтобы увидеть фактический размер объекта в байтах, вы можете использовать sys.getsizeof:

from sys import getsizeof

getsizeof(bx)
112

Это можно проверить, проверив, какой является действительным идентификатором внутренних массивов:

id(bx[0])
# 1434315204368

id(bx[1])
# 1434315203968
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...