Я пытаюсь реализовать функцию, которая должна быть невероятно быстрой, главным образом потому, что она много раз работает с огромными кадрами данных.
R всегда оставлял меня в замешательстве относительно того, почему это иногда немного медленно, и почему это в другое время смехотворно медленно. (К сожалению, это не так быстро.)
Независимо от того, я всегда предполагал, что, когда это возможно, все может происходить намного быстрее, когда они каким-то образом применяются, применяя, применяя или применяя, вместо того, чтобы вводить в цикл. Недавно я столкнулся с примером, который заставляет меня думать, что под капотом происходит что-то еще, что, если бы я это понял, может помочь мне с оптимизацией в будущем.
Вот несколько расчетов, которые я запускал на своей относительно мощной машине Ubuntu Linux:
system.time(sapply(1:1e5, sum))
user system elapsed
35.130 0.000 35.128
system.time(sapply(1:1e5, cumsum))
user system elapsed
0.110 0.000 0.108
Да, вы правильно читаете эти цифры: cumsum, который создает массив суммарной суммы, на порядок быстрее, чем просто предоставление мне простой суммы. (Было бы здорово, если бы кто-то еще мог проверить эти результаты на своей машине!)
Я не вижу, как это возможно, за исключением случаев, когда реализации сильно различаются. Предполагая, что они сильно отличаются друг от друга, я хотел бы знать, каким образом, чтобы я мог следить за определенными функциями, которых можно избежать при поиске скорости. (Для основных функций я не знаю, как увидеть их источник. Стандартные средства просто вводить имя функции без каких-либо круглых скобок не работают для основных функций.)
Большое спасибо!