Подтвердить что ты не робот

Есть ли что-то быстрее, чем dict()?

Мне нужен более быстрый способ хранения и доступа около 3 ГБ пар k:v. Где k - это string или integer, а v - np.array(), которые могут иметь разные формы. Есть ли какой-либо объект, который быстрее, чем стандартный python dict, для хранения и доступа к такой таблице? Например, a pandas.DataFrame?

Насколько я понял, python dict - довольно быстрая реализация хэш-таблицы, есть ли что-то лучше, чем в моем конкретном случае?

4b9b3361

Ответ 1

Нет ничего более быстрого, чем словарь для этой задачи, и потому, что сложность его индексации и даже проверки членства примерно равна O (1).

После сохранения ваших товаров в словаре вы можете получить к ним доступ в постоянное время. Тем не менее, проблема заключается не в процессе индексирования. Но вы можете сделать процесс немного быстрее, выполнив некоторые изменения в ваших объектах и ​​их типах. Это может привести к некоторым оптимизации в рамках операций капота. Например, если ваши строки (ключи) не очень большие, вы можете ставить их в очередь, чтобы их обналичивали в памяти, а не создавали как объект. Если ключи в словаре интернированы и ключ поиска интернирован, сопоставление ключей (после хэширования) может быть выполнено с помощью сравнения указателей вместо сравнения строк. Это делает доступ к объекту очень быстрым. Python предоставил intern() в модуле sys, который вы можете использовать для этой цели.

Введите строку в таблицу "интернированных" строк и верните интернированную строку, которая является самой строкой или копией. Интернированные строки полезны для получения небольшой производительности при поиске словарей...

Вот пример:

In [49]: d = {'mystr{}'.format(i): i for i in range(30)}

In [50]: %timeit d['mystr25']
10000000 loops, best of 3: 46.9 ns per loop

In [51]: d = {sys.intern('mystr{}'.format(i)): i for i in range(30)}

In [52]: %timeit d['mystr25']
10000000 loops, best of 3: 38.8 ns per loop

Ответ 2

Нет, я не думаю, что есть что-то быстрее, чем dict. Сложность его проверки индекса - O(1).

-------------------------------------------------------
Operation    |  Average Case  | Amortized Worst Case  |
-------------------------------------------------------
Copy[2]      |    O(n)        |       O(n)            | 
Get Item     |    O(1)        |       O(n)            | 
Set Item[1]  |    O(1)        |       O(n)            | 
Delete Item  |    O(1)        |       O(n)            | 
Iteration[2] |    O(n)        |       O(n)            | 
-------------------------------------------------------

PS https://wiki.python.org/moin/TimeComplexity

Ответ 3

Вы можете думать о сохранении их в структуре данных, например, Trie, если ваш ключ является строкой. Даже для хранения и извлечения из Trie вам требуется O (N), где N - максимальная длина ключа. То же самое происходит с вычислением хэша, который вычисляет хэш для ключа. Хеш используется для поиска и хранения в Hash Table. Мы часто не рассматриваем время хэширования или вычисления.

Вы можете сделать снимок Trie, который должен быть почти равной производительности, может быть немного быстрее (если значение хэша вычисляется по-разному, скажем

HASH[i] = (HASH[i-1] + key[i-1]*256^i % BUCKET_SIZE ) % BUCKET_SIZE 

или что-то подобное из-за столкновения, нам нужно использовать 256 ^ i.

Вы можете попытаться сохранить их в Trie и посмотреть, как это работает.