Все ответы полезны для сбора информации для написания эффективного кода. Тем не менее, я написал небольшой скрипт на Python для оптимизации под различные случаи. Это будет лучший случай, если предоставленный массив отсортирован. При поиске по индексу ближайшей точки заданного значения модуль bisect
наиболее эффективен по времени. Когда при одном поиске индексы соответствуют массиву, numpy searchsorted
наиболее эффективен.
import numpy as np
import bisect
xarr = np.random.rand(int(1e7))
srt_ind = xarr.argsort()
xar = xarr.copy()[srt_ind]
xlist = xar.tolist()
bisect.bisect_left(xlist, 0.3)
В [63]:% time bisect.bisect_left (xlist, 0,3)
Время процессора: пользователь 0 нс, sys: 0 нс, всего: 0 нс
Время стены: 22,2 мкс
np.searchsorted(xar, 0.3, side="left")
В [64]:% time np.searchsorted (xar, 0.3, side = "left")
Время процессора: пользователь 0 нс, sys: 0 нс, всего: 0 нс
Время выдержки: 98,9 мкс
randpts = np.random.rand(1000)
np.searchsorted(xar, randpts, side="left")
% time np.searchsorted (xar, randpts, side = "left")
Время процессора: пользовательский 4 мс, sys: 0 нс, всего: 4 мс
Время стены: 1,2 мс
Если мы следуем правилу мультипликации, тогда numpy должен занять ~ 100 мс, что означает ~ 83X быстрее.