Ответ 1
Посмотрим...
pandas.unique
говорит, что это "уникальный хэш-стол".
Он вызывает эту функцию для получения правильной реализации хеш-таблицы для ваших данных, а именно htable.Int64HashTable
.
Хэш-таблица инициализируется size_hint
= длина вашего вектора значений. Это означает, что kh_resize_DTYPE(table, size_hint)
.
Эти функции определены (templated) здесь в khash.h
.
Кажется, что выделяет (size_hint >> 5) * 4 + (size_hint) * 8 * 2
байта памяти для ведер (может быть, больше, может быть, меньше, я мог бы быть здесь).
Затем вызывается HashTable.unique()
.
Он выделяет пустой Int64Vector
, который, кажется, в четыре раза увеличивает их размер, когда они заполняются, начиная с 128.
Затем он повторяет ваши значения, выясняя, находятся ли они в хеш-таблице; если нет, они добавляются как в хеш-таблицу, так и в вектор. (Здесь вектор может расти, хэш-таблица не должна расти из-за подсказки размера).
Наконец, NumPy ndarray
делается для указания на вектор.
Так что, думаю, вы видите размер в четыре раза на определенных порогах (что должно быть, если моя ночная математика стоит,
>>> [2 ** (2 * i - 1) for i in range(4, 20)]
[
128,
512,
2048,
8192,
32768,
131072,
524288,
2097152,
8388608,
33554432,
134217728,
536870912,
2147483648,
8589934592,
34359738368,
137438953472,
...,
]
Надеюсь, это проливает свет на вещи :)