Skip to main content
 首页 » 编程设计

python之列表上的 Django lte/gte 查询

2025年05月04日34qlqwjy

我有以下类型的数据:

数据被分割成“帧”,每个帧都有一个开始和结束“gpstime”。在每一帧中都有一堆具有“gpstime”值的点。

有一个框架模型有一个 frame_name,start_gps,stop_gps,...

假设我有一个 gpstime 值列表,想为每个值找到相应的 frame_name。

我可以做一个循环...

framenames = [frames.objects.filter(start_gps__lte=gpstime[idx],stop_gps__gte=gpstime[idx]).values_list('frame_name',flat=True) for idx in range(len(gpstime))] 

这将给我一个“frame_name”列表,每个 gpstime 一个。这就是我要的。然而,这非常慢。

我想知道的是:是否有更好的方法来执行此查找以获取每个 gpstime 的帧名称,这比遍历列表更有效。此列表可能会变得很大。

谢谢!

编辑:框架模型

class frames(models.Model): 
    frame_id = models.AutoField(primary_key=True) 
    frame_name = models.CharField(max_length=20) 
    start_gps = models.FloatField() 
    stop_gps = models.FloatField() 
 
    def __unicode__(self): 
        return "%s"%(self.frame_name) 

请您参考如下方法:

如果我没理解错的话,gpstime 是一个时间列表,你想生成一个帧名列表,每个 gpstime 都有一个。您当前执行此操作的方式确实非常慢,因为它会为每个时间戳进行数据库查询。您需要尽量减少数据库命中数。

我首先想到的答案是使用 numpy。请注意,我在这里没有做任何额外的假设。如果您的 gpstime 列表可以排序,即排序无关紧要,那么它可以更快地完成。

尝试这样的事情:

from numpy import array 
frame_start_times=array(Frame.objects.all().values_list('start_time')) 
frame_end_times=array(Frame.objects.all().values_list('end_time')) 
frame_names=array(Frame.objects.all().values_list('frame_name')) 
frame_names_for_times=[] 
for time in gpstime: 
    frame_inds=frame_start_times[(frame_start_times<time) & (frame_end_times>time)] 
    frame_names_for_times.append(frame_names[frame_inds].tostring()) 

编辑: 由于列表已排序,您可以使用 .searchsorted():

from numpy import array as a 
gpstimes=a([151,152,153,190,649,652,920,996]) 
starts=a([100,600,900,1000]) 
ends=a([180,650,950,1000]) 
names=a(['a','b','c','d',]) 
names_for_times=[] 
 
for time in gpstimes: 
    start_pos=starts.searchsorted(time) 
    end_pos=ends.searchsorted(time) 
    if start_pos-1 == end_pos: 
        print time, names[end_pos] 
    else: 
        print str(time) + ' was not within any frame'