【发布时间】:2021-03-07 07:03:27
【问题描述】:
非常简单,我将 TimeSeries 存储为带有 IDictionary<Datetime, double?> 签名的 DateTime 字典。这将包含一个月的 10 分钟分辨率数据,因此最多 4,464 个条目。
为了处理这个时间序列的部分,我们需要在 start 和 end DateTime 之间提取一个部分。
这样做的一种天真的方法是获取我们感兴趣的范围的字典键的子集:
var reducedKeys = timeSeries.Keys.Where(k => k >= start && k <= end).ToList();
然后从大timeSeries中提取相关部分
var reducedTimeSeries = timeSeries.Where(kvp => reducedKeys .Contains(kvp.Key)).ToDictionary(w => w.Key, w => w.Value);
感觉这不是最佳解决方案;对更快的提取策略有什么建议吗?
为了清楚起见,时间戳的顺序在此阶段基本上是无关紧要的,因为更高级别的计算发生在多个时间序列中,而不是在同一个序列中。提取后有一个扁平线过滤器要运行;但这可以通过迭代时间序列提取中的键的排序副本来运行,因为在从较长的源序列中提取后,我们通常会有 12-24 个样本序列。
【问题讨论】:
-
“更好”和“最佳”都是广义词,包含许多不同的因素。请告诉我们您最感兴趣的指标。“所有指标”是不可接受的:)。另请阅读Eric Lippert's blog post on performance。
-
感谢@HereticMonkey,这是一本好书 :-) 在这种情况下,我们正在考虑的绝对是速度,因为该操作是在一个不适合基于设置的处理的大型循环操作中。
-
如果您不介意向您的应用添加第三方依赖项,您可以考虑使用C5 库。它有一个
TreeDictionary集合,其中包含方法RangeFromTo,该方法有效地返回集合内的一系列键。 -
如果偏移量总是来自同一个日期,那么你可以只使用一个带有开始日期的数组,并且每个后续元素都是10分钟的偏移量
标签: c# performance linq dictionary datetime