У меня есть следующая задача в симуляции для моей кандидатской диссертации:
Мне нужно оптимизировать следующий код:
repelling_forces = repelling_force_prefactor * np.exp(-(height_r_t/potential_steepness))
В этом коде фрагмент 'height_r_t' является настоящим массивом Numpy, а 'factor_steepness' является скаляром. 'repelling_force_prefactor' также является массивом Numpy, который в основном равен нулю, но ОДИН в предварительно рассчитанной позиции, которые НЕ меняются во время выполнения (то есть маски).
Очевидно, что код неэффективен, так как было бы гораздо разумнее вычислять экспоненциальную функцию только в тех позициях, где 'repelling_force_prefactor' не равен нулю.
Вопрос в том, как мне сделать это наиболее эффективным способом?
Единственная идея, которая у меня есть до сих пор, состоит в том, чтобы определить срез для 'height_r_t', используя 'repelling_force_prefactor', и применить 'np.exp' к этим срезам. Однако я понял, что нарезка медленная (не уверен, что это в целом правильно), и решение кажется неуклюжим.
Точно так же, как примечание, отношение «1» к «0» в «repelling_force_prefactor» составляет около 1/1000, и я выполняю это в цикле, поэтому эффективность очень важна.
(Комментарий: у меня не было бы проблем с обращением к Cython, так как мне все равно понадобится / хочу изучить его в какой-то момент ... но я новичок, поэтому мне нужен хороший указатель / объяснение.)