[お詫びと訂正]結合したQueryへのfetch()的アクセス

前回のエントリーでqueryをitertools.chain()してitertools.islice()すると複数のqueryを結合してfetch()できるよ。と書きましたが、その後の検証で非常に非効率な処理が走る事が判明したので訂正します。
具体的にはitertools.islice()でイテレーターをスキップさせると内部的にはスキップさせた分だけnext()が走るみたいです。
つまり
islice('ABCDEFG', 2, 4) 
はC、Dを返すのですが、A、Bに関して戻り値に含まれないだけで内部では走査されちゃうようです。

例えば
q1 = HogeModel.all().filter("name =", "Spike Spigel")
q2 = HogeModel.all().filter("name =", "Jet Black")
q3 = HogeModel.all().filter("name =", "Faye Valentine")
qchain = chain(q1,q2,q3)    

 #1000番から1020番のQuery結果を得る
islice(qchain,1000,1020)
を実行した場合、queryが1000回、next()を実行する事になります。 という訳でこの方法はトンでもないバッドノウハウだったので、この場を借りて深くお詫びいたします。

ちなみに余談ですが、
q1 = HogeModel.all().filter("name =", "Spike Spigel")
q1[1000:1020]
と実行した場合はfetch()が走り、next()をぶん回す事は無いようです。

Trackback

http://memo.kappa-lab.com/mt-tb.cgi/327

Leave your comment :

(いままで、ここでコメントしたことがないときは、コメントを表示する前に承認が必要になることがあります。そのときはしばらくお待ちください。)




RSS + Contuct

  • rss
  • email

Credit

Copyright (C) 2007 kappa-lab.com.
All Rights Reserved.