Как правило, ряды Deedle и фреймы данных имеют некоторые дополнительные издержки по сравнению с написанием кода, созданного вручную, с использованием любой наиболее эффективной структуры данных для данной проблемы.Накладные расходы малы для некоторых операций и больше для некоторых операций, поэтому они зависят от того, что вы хотите сделать, и от того, как вы используете Deedle.
Если вы используете Deedle так, как это было задумано,тогда вы получите хорошую производительность, но если вы выполните большое количество операций, которые не особенно эффективны, вы можете получить плохую производительность.
В вашем конкретном случае вы запускаете Series.filter
на 1000Создание серии и создание новой серии (что и происходит здесь за кулисами) имеет некоторые накладные расходы.
Однако, на самом деле ваш код делает то, что вы используете Series.filter
, чтобы найти значение с определенным ключом,Для этого Deedle предоставляет операцию поиска на основе ключей (и это одна из вещей, для которой она была оптимизирована).
Если переписать код следующим образом, вы получите гораздо лучшую производительность с Deedle, чем со списком:
d |> List.map (fun x -> tsSeries.[x])
// 0.001 seconds
d |> List.map (fun x -> (tsSeries |> Series.filter (fun key _ -> key = x)))
// 3.46 seconds
d |> List.map (fun x -> (tsList |> List.filter (fun y -> y.Date = x)))
// 40.5 seconds