2015-07-11 4 views
1

У меня есть список примерно 100M + элементов (в настоящее время отсортированных), которые я хочу рандомизировать (перетасовать) И кусок/разделить на более мелкие списки (около 50 тыс. Ковшей). Каков наилучший способ сделать это с точки зрения максимальной скорости?Как перетасовать и разбить большой список на более мелкие, пытаясь максимизировать скорость?

Я открыт для любых библиотек или языков (в настоящее время используется узел и python для проекта), если у них есть быстрые встроенные методы. Благодаря!

P.S. Это не просто теоретическое упражнение, я пытаюсь понять это для своей стажировки, так как мы будем запускать другой скрипт параллельно, используя около 50K цифровых узлов Ocean Ocean, которые берут меньшие списки в качестве входных данных.

+5

Вы разработали метод самостоятельно, протестировал его и нашел, что он слишком медленный для ваших целей? – TigerhawkT3

+0

Было бы просто просто перетасовать список индексов целочисленных элементов, кроме самого списка. То же самое можно сказать и о том, чтобы разбить его на более мелкие списки (т. Е. Создать список диапазонов индексов). Оба могут быть выполнены с использованием встроенных модулей. – martineau

+2

Мы не предлагаем лучший подход здесь. Вы публикуете свой подход, и мы стараемся сделать его лучше. – CrakC

ответ

1

Сделайте это на C или C++ для максимальной скорости.

Используйте «современный» Fisher-Yates shuffle на вашем массив записей. Используйте быстрый случайный, возможно, один найденный на stack overflow.

Затем вернитесь адреса элементов в массиве на bucksize (= 50000) смещение, например & массив [0], & массив [50000] & массив [100000] ...