gpt4 book ai didi

python - 这条 python 可以更短吗

转载 作者:太空宇宙 更新时间:2023-11-04 09:16:56 24 4
gpt4 key购买 nike

我倾向于在不牺牲运行时效率的情况下尽可能简洁明了地表达代码。

这是我的代码:

p_audio = plate.parts.filter(content__iendswith=".mp3") 
p_video = not p_audio and plate.parts.filter(content__iendswith=".flv")
p_swf = not p_audio and not p_video and plate.parts.filter(content__iendswith=".swf")
extra_context.update({
'p_audio': p_audio and p_audio[0],
'p_video': p_video and p_video[0],
'p_swf': p_swf and p_swf[0]
})

是否有任何 python/django 专家可以大大缩短这段代码?

最佳答案

实际上,在您追求紧凑和高效的过程中,您设法编写出效率低得可怕的代码。这是因为当您引用 p_audionot p_audio 时,会导致对该查询集进行求值 - 因为您在此之前没有对其进行切片,这意味着整个过滤器是从数据库中获取的——例如所有以 mp3 结尾的 plate 对象,等等。

在引用该查询的值之前,您应该确保首先为每个查询执行切片。由于您关心代码的紧凑性,您可能希望首先使用 [:1] 进行切片,以获取单个对象的查询集:

p_audio = plate.parts.filter(content__iendswith=".mp3")[:1]
p_video = not p_audio and plate.parts.filter(content__iendswith=".flv") [:1]
p_swf = not p_audio and not p_video and plate.parts.filter(content__iendswith=".swf")[:1]

其余的可以保持不变。

编辑添加 因为您只对每个列表的第一个元素感兴趣,事实证明您只将 [0] 从每个元素传递到上下文。但是在你的代码中,not p_audio 指的是原始的、未切片的查询集:为了确定 qs 的真/假值,Django 必须对其进行评估,它从数据库中获取所有匹配的元素并转换它们变成 Python 对象。由于您实际上并不需要这些对象,因此您所做的工作比您需要的多得多。

请注意,它并不是每次 都重新运行它:只是第一次,因为在第一次评估之后,查询集会在内部缓存。但正如我所说,这已经超出了您的预期。

关于python - 这条 python 可以更短吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8188638/

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