Python 在已排序的日期列表中查找新数据插入位置的最快方法
假设我有一个日期列表:Python 在已排序的日期列表中查找新数据插入位置的最快方法,python,search,insert,Python,Search,Insert,假设我有一个日期列表: mydates = [Timestamp('2017-03-31 00:00:00'), Timestamp('2017-06-30 00:00:00') Timestamp('2017-09-30 00:00:00'), Timestamp('2017-12-31 00:00:00'), Timestamp('2018-03-31 00:00:00')] 我得到了一个新的日期,想知道该插入哪个位置。如果该日期已在列表中,我们假设将再次将其插入现有
mydates = [Timestamp('2017-03-31 00:00:00'),
Timestamp('2017-06-30 00:00:00')
Timestamp('2017-09-30 00:00:00'),
Timestamp('2017-12-31 00:00:00'),
Timestamp('2018-03-31 00:00:00')]
我得到了一个新的日期,想知道该插入哪个位置。如果该日期已在列表中,我们假设将再次将其插入现有日期的右侧
也就是说,
'2016-12-10'
将插入位置0,左至时间戳('2017-03-31 00:00:00')
,等等。如果您有已排序的列表,您可以插入新日期并对结果进行排序。您还可以使用。如果您有已排序的列表,则可以插入新日期并对结果进行排序。您也可以使用。一般来说,找到位置的最佳方法是对数搜索。但细节取决于你拥有什么
另外,请注意,即使您将搜索从线性时间改进为对数时间,如果您使用的是列表
或数组
之类的数据结构,插入
仍然需要线性时间(因为它必须将列表的其余部分向上移动)。因此,您可能优化了错误的内容
- 对于一个非常小的集合,比如一个包含5个值的
,您最好只使用线性搜索列表
- 如果您在一个阶段中完成了几乎所有的插入,并且在收集之后几乎所有的搜索都已经完成,只需使用
集合收集所有内容。添加
或
列表。追加
,然后在该阶段结束时对其进行
排序。这仍然是有效的(摊销)日志时间,但有更好的乘数
- 对于
或其他普通列表
,请使用stdlib李>序列
- 对于numpy
,或在其上构建的类似熊猫数组
系列的东西:使用numpy的。(如果您正在存储一组Pandas
对象,您可能应该使用这些数据结构中的一种,而不是Timestamp
,如果您还没有这样做的话。)列表
- 如果您正在执行大量插入(和删除?)与查找交错,那么您可能希望切换到对数数据结构。这里有很多选择,但类似的东西是一个很好的起点
列表
或数组
之类的数据结构,插入
仍然需要线性时间(因为它必须将列表的其余部分向上移动)。因此,您可能优化了错误的内容
- 对于一个非常小的集合,比如一个包含5个值的
,您最好只使用线性搜索列表
- 如果您在一个阶段中完成了几乎所有的插入,并且在收集之后几乎所有的搜索都已经完成,只需使用
集合收集所有内容。添加
或
列表。追加
,然后在该阶段结束时对其进行
排序。这仍然是有效的(摊销)日志时间,但有更好的乘数
- 对于
或其他普通列表
,请使用stdlib李>序列
- 对于numpy
,或在其上构建的类似熊猫数组
系列的东西:使用numpy的。(如果您正在存储一组Pandas
对象,您可能应该使用这些数据结构中的一种,而不是Timestamp
,如果您还没有这样做的话。)列表
- 如果您正在执行大量插入(和删除?)与查找交错,那么您可能希望切换到对数数据结构。这里有很多选择,但类似的东西是一个很好的起点
时间戳
?假设时间戳
来自pandas库,您应该利用np.searchsorted
:np.searchsorted(mydates,Timestamp('2016-12-10'))
-返回0。如果您有排序数组,二进制搜索通常是搜索它的最佳方式。它的可能重复项看起来不像您的日期已排序。那么什么是Timestamp
?假设Timestamp
来自熊猫库,您应该利用np.searchsorted
:np.searchsorted(mydates,Timestamp('2016-12-10'))
-返回0。如果您有一个排序的数组,二进制搜索通常是搜索它的最佳方式。可能是重复的