После многих попыток оптимизации кода, кажется, что одним из последних ресурсов будет попытка выполнить код ниже с использованием нескольких ядер. Я не знаю точно, как преобразовать/переструктурировать мой код, чтобы он мог работать намного быстрее, используя несколько ядер. Буду признателен, если я смогу получить руководство для достижения конечной цели. Конечной целью является возможность быстрого запуска этого кода для массивов A и B, где каждый массив содержит около 700 000 элементов. Вот код с использованием небольших массивов. Массивы элементов 700k закомментированы.
import numpy as np
def ismember(a,b):
for i in a:
index = np.where(b==i)[0]
if index.size == 0:
yield 0
else:
yield index
def f(A, gen_obj):
my_array = np.arange(len(A))
for i in my_array:
my_array[i] = gen_obj.next()
return my_array
#A = np.arange(700000)
#B = np.arange(700000)
A = np.array([3,4,4,3,6])
B = np.array([2,5,2,6,3])
gen_obj = ismember(A,B)
f(A, gen_obj)
print 'done'
# if we print f(A, gen_obj) the output will be: [4 0 0 4 3]
# notice that the output array needs to be kept the same size as array A.
То, что я пытаюсь сделать, это имитировать функцию MATLAB под названием ismember [2] (тот, который отформатирован как: [Lia,Locb] = ismember(A,B)
Я просто пытаюсь получить только часть Locb
.
Из Matlab: Locb, содержащий наименьший индекс в B для каждого значения в A, являющегося членом B. Выходной массив, Locb, содержит 0, где A не является членом B
Одна из основных проблем заключается в том, что мне нужно максимально эффективно выполнять эту операцию. Для тестирования у меня есть два массива из 700 тыс. Элементов. Создание генератора и прохождение значений генератора, похоже, не ускоряет работу.