Используйте NumPy структурированный массив вместо dict, чтобы сэкономить пространство и сохранить скорость - PullRequest
0 голосов
/ 24 сентября 2019

Являются ли numpy структурированные массивы альтернативой Python dict?

Я хотел бы сэкономить память и не могу компенсировать большую часть снижения производительности.

В моем случаеключи str и значения int.

Можете ли вы дать строку быстрого преобразования, если они действительно являются альтернативой?

Я также не против, если вы можете предложитьдругая альтернатива.

Мне нужно сэкономить память, потому что в некоторых словарях объем памяти превышает 50 ГБ, и мне нужно открывать несколько одновременно с доступной только 192 ГБ ОЗУ.

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

массив numpy использует непрерывный блок памяти и может хранить только один тип объекта, такой как int, float, string или другой объект.Где каждому элементу выделены фиксированные байты в памяти.

Numpy также предоставляет набор функций для работы, таких как обход массива, арифметическая операция, некоторая строковая операция над теми сохраненными элементами, которые реализованы с использованием c.Так как эти операции не имеют накладных расходов на python, они обычно более эффективны с точки зрения как памяти, так и вычислительной мощности

Поскольку вам нужна пара ключ-значение, вы можете также сохранить ее в массиве numpy, аналогичном c-struct, но этоне будет иметь таких функций, как dict, как поиск элемента, проверка наличия ключевой существующей фильтрации и т. д. вы сами делаете это, используя функциональность массива

лучший вариант , для вас это может быть серия pandas,который также использует массив numpy для хранения своих данных, предоставляет вам множество функций поверх него

0 голосов
/ 24 сентября 2019

Вы можете использовать размер объекта в памяти, используя sys

import sys
import numpy as np

x = np.array([('Rex', 9, 81.0), ('Fido', 3, 27.0)],
    dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])

print(sys.getsizeof(x))

y = {
    1 : {
        'name': 'Rex',
        'age' : 9,
        'weight' : 81.0
    },
    2 : {
        'name': 'Fido',
        'age' : 3,
        'weight' : 27.0
    }
}

print(sys.getsizeof(y))
  1. 192
  2. 240

Это результаты.Я считаю, что структурированный массив numpy относительно эффективен в использовании памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...