Я думаю, что ваши измерения, скорее всего, правильные.Ряд Deedle определенно добавляет заметные накладные расходы на массивы - это потому, что он также добавляет много дополнительных функций, связанных с обработкой пропущенных значений и всеми функциями, связанными с тем, что ряд является отображением значения ключа.
ЕслиВы делаете чисто числовые вычисления, которые не включают в себя грязные данные или данные с индексом, тогда вам, вероятно, следует использовать библиотеку матричных манипуляций или необработанные массивы.
Мои простые измерения с использованием #time
следующие:
#time
let rnd = System.Random()
let s = series [ for i in 0 .. 1000000 -> i, rnd.NextDouble() ]
let a = [| for i in 0 .. 1000000 -> rnd.NextDouble() |]
// ~950ms
let r = 1. / (1. + exp(-s))
// ~290ms
s |> Series.map (fun _ v -> 1. / (1. + exp(-v)))
// ~25ms
a |> Array.map (fun v -> 1. / (1. + exp(-v)))
Стоит отметить, что Series.map
намного быстрее, чем выполнение последовательности двоичных операторов напрямую, потому что ему нужно создать только один новый экземпляр серии.