У меня возникла проблема с эффективностью при попытке решить следующую задачу в программе Python: предположим, у нас есть список огромных_списков, содержащий такие кортежи: (label1, label2, numeric_value) Где label* — это просто строки, которые используются, чтобы узнать, что означает числовое_значение в контексте моей программы. В обычном приложении программы этот список может содержать до 10 миллионов элементов. Я хочу вычислить, учитывая фиксированную строку x, среднее значение значений «numerical_value», содержащихся в списке, так что соответствующий кортеж label2 равен x. Очевидная идея состоит в том, чтобы просто создать генератор списка, который фильтрует кортежи, соответствующие условию, а затем вычисляет среднее значение по этому сокращенному списку:interest_values = [значение для _, label2, dist в огромных_списке, если label2==x] среднее = np. mean(interesting_values)
Но поскольку список огромен, выполнение этой операции занимает слишком много времени. Более того, моей программе удобно хранить эти значения таким образом, поскольку мне нужно их упорядочить и, следовательно, создать другую структуру, например словарь:
Код: Выделить всё
values_dict[label2][label1] = numerical_value
Это вызовет больше проблем в других частях программы. Я также хочу, если это возможно, избегать создания обеих структур данных. Другая возможность, которую я рассматривал, заключается в том, что в той части программы, где вычисляются эти числовые значения, это будет означать их вычисление с фиксацией каждой метки2, вычисление среднего значения на данный момент и его сохранение, но это потребует большого изменения в программе. , и особенно в способе его распараллеливания (исправление label1 для каждого процесса, поскольку ожидается, что набор значений label2 будет гораздо большего порядка, чем label1, и если сделать это наоборот, это сделает его намного медленнее.) Есть ли альтернативный способ эффективного вычисления этого значения с помощью списка огромных_списков, или мне следует поискать другой способ хранения значений? Я думал об использовании фреймов данных pandas, поскольку они позволили бы мне упорядочить значения, а также вычислить среднее значение, но я не уверен, повысит ли это эффективность. Я также обнаружил библиотеку cuDF в ходе быстрого поиска, который я сделал, чтобы увидеть, могут ли графические процессоры позволить мне каким-либо образом распараллеливать вещи, но я также не уверен, поможет ли это, поскольку мы не говорим об операциях между кадрами данных, а о вычислениях внутри самого фрейма данных.
Я ожидал, что описанное выше понимание списка эффективно решит мою проблему, но, поскольку это не так, я хочу найти способ сделать это в более эффективный способ без изменения моей структуры данных из-за того, как эти значения рассчитываются моей программой.
Подробнее здесь:
https://stackoverflow.com/questions/791 ... -by-labels