首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是懒惰评估的合理用例吗?

这是懒惰评估的合理用例吗?
EN

Stack Overflow用户
提问于 2012-06-13 03:19:55
回答 4查看 98关注 0票数 2

我有一个名为Video的python类,它表示YouTube视频。给定YouTube视频的ID,video将返回表示该视频的对象。但是,第一次创建视频对象时,不会查询YouTube。仅当请求需要来自YouTube的信息的属性时,才查询YouTube。下面是它的工作原理:

代码语言:javascript
复制
>>> from video import Video
>>> video = Video('B11msns6wPU') 
# 'B11msns6wPU' is the ID of a video
>>> video
Video(youtube_id="B11msns6wPU")
### As of now, no call to YouTube's API has been made
### Next, I ask for the title attribute. The object queries YouTube's API to get 
### this information. In doing so, the object is completely initialized
>>> video.title
u'Badly Drawn Boy - Disillusion (directed by Garth Jennings)'
>>> video.duration
u'275'
# no query was made to the API because the object has been already been initialized

我不确定这是不是技术上的“懒惰评估”,但它在风格上是相似的。在第一次调用属性之前,视频对象不会被初始化。我想知道这项技术是否值得实现。显然,这会使我的代码变得更加复杂。你的想法是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-13 03:30:56

这是一种普遍的判断,而不是一成不变的决定。

如果惰性对象Video类实例是应用程序的核心,那么在执行其他操作之前完全初始化它可能是有意义的;如果应用程序没有数据就没有用,请先获取数据。

但是,如果您的应用程序可能有成百上千个这样的Video实例,并且它们中的大多数都不会被使用,那么让用户等待您初始化所有这些实例是没有意义的。在这种情况下,将初始化推迟到真正需要时才会很有意义。例如,如果您将显示“缩略图的墙”,您可能需要每个视频和标题的缩略图,但除非用户单击缩略图,否则您可能不需要任何其他内容。

我确实喜欢通用的方法,即使用对象的代码不需要知道或关心对象是否已预初始化。

票数 2
EN

Stack Overflow用户

发布于 2012-06-13 03:33:14

这是lazy loading。如果不总是需要这些属性,那么实现这些属性是值得的,而且从api中查询它们也是一种浪费。与在中一样,我创建了一个Video类,但我不需要这些属性。

当类属性需要很长时间来获取/加载时,延迟加载是一个好主意。那么,在您的情况下,API调用是否昂贵,您的Video类是否真的需要它?有关Video类的更多信息将有助于了解它是否值得实现。延迟加载只是为了延迟加载而增加了代码的复杂性,所以,是的,看看是否需要延迟加载是很重要的。

归根结底,这一切都取决于您如何处理应用程序中的Video对象。

票数 2
EN

Stack Overflow用户

发布于 2012-06-13 03:33:39

Lazy evaluation (或lazy loading,或lazy initialization)在以下情况下很有用:后续操作否则将需要对后端进行更多查询,或者当一个请求非常大以至于可以分块执行,或者当您很可能不会使用请求的每个部分时……一般来说,这是在急切的行为(例如Python2.x中的range() )和懒惰(Python3.x中的range())之间的选择。

在这种情况下,似乎无论如何使用视频对象,最终所发生的都是对该单个对象的Youtube API的调用。

如果您的库支持更复杂的查询或用法,那么惰性评估可能非常有用。大致是这样的:

代码语言:javascript
复制
>>> video_list = ['B11msns6wPU', 'GuaCaMole', 'OvER9000']
>>> videos = Video.fetch(video_list)
# No API call, yet
>>> videos.filter_by('duration', lambda dur: int(dur) > 200)
# Filter by duration - still no API call
>>> for v in videos.all:
...     # Now the API call is made, and the filtering is done all at once

诚然,我知道我的示例是人为设计的(它看起来奇怪地像一个DB库……),但这就是它的要点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11003370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档