gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:13:53 28 4
gpt4 key购买 nike

我有以下类型的数据:

数据被分割成“帧”,每个帧都有一个开始和结束“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'

关于python - 列表上的 Django lte/gte 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17051654/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com