У меня сложная вложенная структура данных.Я перебираю его и выполняю некоторые вычисления для каждой возможной уникальной пары элементов.Это все математические функции в памяти.Я не читаю из файлов и не работаю по сети.
Требуется несколько часов, чтобы do_work()
вызывали 25 000 раз.Я ищу способы ускорить его.
Хотя Pool.map()
кажется полезным для моих списков, это оказывается сложным, потому что мне нужно передать дополнительные аргументы в отображаемую функцию.
Я подумал, что использование библиотеки Python multitasking
поможет, но когда я использую Pool.apply_async()
для вызова do_work()
, это на самом деле занимает больше времени.
Я немного погуглил и блогер говорит «Использовать синхронизацию для операций в памяти - асинхронность - это пустая трата времени, когда вы не производите блокировку вызовов». Это правда?Может кто-нибудь объяснить, почему?Операции чтения и записи в оперативной памяти мешают друг другу?Почему мой код занимает больше времени с асинхронными вызовами?do_work()
записывает результаты вычислений в базу данных, но это не меняет мою структуру данных.
Конечно, есть способ использовать мои ядра процессора вместо простой линейной итерации по моим спискам.
Моя отправная точка, делающая это синхронно:
main_list = [ [ [a,b,c,[x,y,z], ... ], ... ], ... ] # list of identical structures
helper_list = [1,2,3]
z = 2
for i_1 in range(0, len(main_list)):
for i_2 in range(0, len(main_list)):
if i_1 < i_2: # only unique combinations
for m in range(0, len(main_list[i_1])):
for h, helper in enumerate(helper_list):
do_work(
main_list[i_1][m][0], main_list[i_2][m][0], # unique combo
main_list[i_1][m][1], main_list[i_1][m][2],
main_list[i_1][m][3][z], main_list[i_2][m][3][h],
helper_list[h]
)
Имена переменных были изменены, чтобы сделать его более читабельным.