Я ищу быстрый способ обновления значений в (упорядоченном) словаре, который содержит десятки миллионов значений, где обновленные значения хранятся в списке / массиве.
Программа, которую я пишу, берет список ключей из исходного словаря (которые являются числовыми кортежами) в виде массива-пустышки и передает их через функцию, которая возвращает массив новых чисел (по одному для каждого значения ключа).).Затем этот массив умножается на соответствующие значения словаря (посредством пошагового умножения массива), и именно этот возвращаемый одномерный массив значений мы хотим использовать для обновления словаря.Записи в новом массиве хранятся в порядке соответствующих ключей, поэтому я мог бы использовать цикл, чтобы пройти по словарю и обновить значения одно за другим.Но это слишком неэффективно.Есть ли более быстрый способ обновления значений в этом словаре, который не использует циклы?
Примером подобной проблемы может быть, если ключи в словаре представляют координаты x и y точекв пространстве, а значения представляют силы, прилагаемые в этой точке.Если мы хотим вычислить крутящий момент, испытываемый в каждой точке от начала координат, нам сначала понадобится функция, подобная:
def euclid(xy):
return (xy[0]**2 + xy[1]**2)**0.5
, которая, если xy
представляет x, y-кортеж, вернет евклидовурасстояние от начала координатЗатем мы могли бы умножить это на соответствующее значение словаря, чтобы вернуть крутящий момент, например так:
for xy in dict.keys():
dict[xy] = euclid(xy)*dict[xy]
Но этот цикл медленный, и мы могли бы воспользоваться алгеброй массива, чтобы получить новые значения в одной операции:
new_dict_values = euclid(np.array(dict.keys()))*np.array(dict.values())
И именно здесь мы хотим найти быстрый способ обновления словаря вместо использования:
i = 0
for key in dict.keys():
dict[key] = new_dict_value[i]
i += 1