db.Property机制解析

标签:Google App Engine, Python

最开始接触GAE的API时,就对它的Property很感兴趣。因为我明明只是在Model定义时设置了类属性,但是它的实例的属性却必须和类属性的类型一致,还要接受各种检查之类的。只不过当时Python了解不深,看不懂其中的奥秘,而如今总算可以把它弄懂了。

Expando比Model的反序列化更花时间

标签:Google App Engine, Python

写了这样一个测试
from time import time

class Comment(db.Expando):
	email = db.StringProperty(required=True)
	content = db.TextProperty()
	format = db.IntegerProperty(default=0, indexed=False)
	approved = db.BooleanProperty(default=True)
	time = db.DateTimeProperty(auto_now_add=True)
	mod_time = db.DateTimeProperty(auto_now_add=True, indexed=False)

t=time()
Comment.all().fetch(1000)
print time()-t
从后台的执行情况来看,cpu时间是11078~11799ms。改成db.Model后,cpu时间是10319~10959ms,差不多少了0.8秒。

Model实例与dict和JSON相互转换的方法

标签:Google App Engine, Python

今天在读GAE SDK源码时发现,Entity实际上就是dict的子类,而Model也有个转换成Entity对象的_to_entity方法,于是可以轻易转换成dict对象,再用simplejson转换成JSON即可。

转换回去就更简单了,因为Model的构造函数是可以传字典参数的,而且还有个from_entity类方法。

原来可以通过key直接删除实体了

标签:Google App Engine, Python

记得最初删除实体时,还需要先fetch或get实体,再调用实体的delete方法或db.delete()来删除,这就导致了删除时效率特别低。

今天突发奇想,觉得db.delete()应该可以接受key做参数,于是看了下源码,发现果然是可行的,而且传实体给它也会被自动转换成key,那么直接传key自然效率更高。

发现一款高性能的PHP博客程序:Sablog-X

标签:PHP

提到博客程序,大多数人第一反应就是WordPress了,毕竟用户最多,插件和主题也众多。
不过今天在闲聊中发现WordPress性能有很大问题:在我自己电脑上测试时,打开使用默认主题、没装插件、只有2篇文章的首页需要25次数据库查询,后续访问需要17次数据库查询,花费0.3~0.4秒;而同样是在我电脑上,打开有上万帖的Discuz!论坛首页需28次查询,后续为6次,花费0.1~0.2秒。不得不说WordPress这样差强人意的性能实在太让人吐血了。

用deferred时遇到个PicklingError

标签:Google App Engine, Python

用deferred写了个任务,本以为没错的代码,测试时却遇到这个错误:
<class 'pickle.PicklingError'>: Can't pickle <function generate_categories at 0x6a4387e469f6a3b8>: it's not found as model.generate_categories
研究了半天才明白过来,model.generate_categories这个玩意我当然没有定义,我是在model模块里调用Category.generate_categories()这个静态函数。看来pickle这个玩意比较傻,只能识别全局对象。

于是加了一行赋值代码,问题解决:
generate_categories = Category.generate_categories

« 看看还有什么好玩意