2

YouTubeビデオを表すVideoというPythonクラスがあります。YouTubeビデオのIDを指定すると、Videoはそのビデオを表すオブジェクトを返します。ただし、Videoオブジェクトが最初に作成されるとき、YouTubeは照会されません。YouTubeは、YouTubeからの情報を必要とする属性が要求された場合にのみクエリされます。仕組みは次のとおりです。

>>> 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

これが技術的に「遅延評価」であるかどうかはわかりませんが、味は似ています。属性の最初の呼び出しが行われるまで、ビデオオブジェクトは初期化されません。このテクニックを実装する価値があるかどうか疑問に思います。明らかに、それは私のコードをもう少し複雑にします。あなたの考えは何ですか?

4

4 に答える 4

2

これは一種の一般的な判断の呼びかけであり、厳格な決定ではありません。

遅延オブジェクト (Videoクラス インスタンス) がアプリケーションの中心にある場合は、他の処理を行う前にそれを完全に初期化することが理にかなっています。アプリがデータなしでは役に立たない場合は、最初にデータを取得してください。

ただし、アプリにこれらのインスタンスが数百または数千ある可能性がありVideo、それらのほとんどが使用されない場合、それらすべてを初期化する間、ユーザーを待たせることは意味がありません。この場合、本当に必要になるまで初期化を延期することは非常に理にかなっています。たとえば、「サムネイルのウォール」ディスプレイを表示する場合、各ビデオのサムネイルとタイトルが必要になる場合がありますが、ユーザーがサムネイルをクリックしない限り、他には何も必要ない場合があります。

オブジェクトを使用するコードは、オブジェクトが事前に初期化されているかどうかを認識したり気にしたりする必要がないという一般的なアプローチが好きです。

于 2012-06-12T19:30:56.473 に答える
2

これはlazy loading。これらの属性が常に必要であるとは限らず、API からそれらを無料で照会するのはもったいない場合は、実装する価値があります。のように、Videoクラスを作成しますが、それらの属性は必要ありません。

クラス属性のフェッチ/ロードに時間がかかる場合は、遅延ロードを使用することをお勧めします。あなたの場合、API 呼び出しは高価で、Videoクラスに本当に必要ですか? Video クラスの詳細は、実装する価値があるかどうかを確認するのに役立ちます。遅延ロードのためだけに遅延ロードを行うと、正当な理由もなくコードが複雑になるため、遅延ロードが必要かどうかを確認することが重要です。

結局のところ、すべては、アプリケーションで Video オブジェクトをどう処理するかにかかっています。

于 2012-06-12T19:33:13.777 に答える
1

遅延評価(または遅延読み込みまたは遅延初期化) は、後続の操作でバックエンドへのより多くのクエリが必要な場合、または要求が大きすぎてチャンクで実行する方が有益な場合、または可能性が高い場合に役立ちます。リクエストのすべての部分を使用するわけではありません... 一般に、熱心な動作 ( range()Python 2.x など) と怠惰 ( range()Python 3.x の場合) のどちらかを選択します。

この場合、ビデオ オブジェクトがどのように使用されても、最終的に発生するのは、その1 つのオブジェクトに対する Youtube API の呼び出しだけです。

ライブラリがより複雑なクエリや使用法をサポートしている場合は、遅延評価が非常に役立つ可能性があります。次のようなもの:

>>> 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 ライブラリのように見えます...)、それが要点です。

于 2012-06-12T19:33:38.783 に答える
0

はい、遅延評価を実装しています。「それだけの価値があるか」という質問に対する他の回答として、データの使用パターンと、ユーザーを待たせたい時期によって異なります。留意すべきもう 1 つの点は、ビデオ データのプルに時間がかかる可能性があるが、データが必要であることがかなり確実である場合は、別の実行スレッドでデータをプルしてプリフェッチすることができるということです。

使用したタイプの遅延評価を実装し、コード内の複雑さを回避する 1 つの方法は、ピラミッド ライブラリで @reify のようなデコレータを使用することです。このブログ エントリのピラミッド ライブラリの @reify デコレータを見てください。下部にソースを具体化するためのリンクが含まれています。

これは実装したい方法ではないかもしれませんが、遅延評価に対する「pythonic」ソリューションを検討する価値があります。

于 2012-06-12T19:36:41.730 に答える