这两段代码有什么区别?
query=Location.all(keys_only=True)
while query.count()>0:
db.delete(query.fetch(5))
# --
while True:
query=Location.all(keys_only=True)
if not query.count():
break
db.delete(query.fetch(5))
Run Code Online (Sandbox Code Playgroud)
他们都工作.
从逻辑上讲,这两段代码执行完全相同的操作 - 它们一次删除每个Location实体5个.
第一段代码在样式方面和(略微)性能方面都更好.(查询本身不需要在每个循环中重建).
但是,此代码的效率并不高.它有几个问题:
你使用count()但不需要.简单地获取实体,然后测试结果以查看是否有任何实体会更有效.
您正在向数据存储区进行更多往返访问.每个count(),fetch()和delete()调用必须进入数据存储区并返回.这些往返很慢,所以你应该尽量减少它们.您可以通过在每个循环中获取更多实体来完成此操作.
例:
q = Location.all(keys_only=True)
results = q.fetch(500)
while results:
db.delete(results)
results = q.fetch(500)
Run Code Online (Sandbox Code Playgroud)
编辑:看看下面的Nick的答案 - 他解释了为什么使用查询游标可以进一步提高代码的性能.
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |