Protocol Buffers (类似XML的一种数据描述语言)最新版本2.3里,protoc—py_out命令只生成原生的Python代码。 尽管PB(Protocol Buffers)可以为C++语言生成快速解析和序列化代码,但是这种方式对于Python不适用,并且手动生成的已包装的代码需要非常大的维护工作。在讨论组里,这是一个常见的功能要求,由于一个必备的客户端组件—AppEngine(根据团队介绍名称为AppEngine),生成原生的Python代码有更高的优先级。
幸运的是, PB 2.4版本中本地化代码已被提名,在 svn的分支中已经可以下载,因此你能够使用快速的 PB有一段时间了。 (我们使用 r352版本有一段时间了,还没有遇到任何问题。) PB团队一直不愿轻易指定任何发布日期,在我的威胁下, Kenton Varda提到日期初步定在 2011年初。
我没有在其它地方看见过这个文档,希望它能对其他人有所帮助.
如何做能让它快起来
安装好新的PB库之后并使用 protoc --py_out=... 重新构建好你的PB之后,你需要在运行你的Python程序之前进行环境变量 PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp 的设置,以便于选择C++的,或者PB默认使用的Python实现.
就这样了!这至少就能在可以动态转化/序列化消息的PB运行时库用通用的C++代码了. (注意我们还没有生成任何C++代码.)
它能有多快呢"htmlcode">
nruns = 1000nwarmups = 100xs = ... # your protobufsdef ser(): return [x.SerializeToString() for x in xs]def parse(ys): for y in ys: pb.Email().ParseFromString(y) t = timeit.Timer(lambda:None) t.timeit(nwarmups)print 'noop:', t.timeit(nruns) / nruns t = timeit.Timer(ser) t.timeit(nwarmups)print 'ser:', t.timeit(nruns) / nruns / len(xs) ys = ser() t = timeit.Timer(lambda: parse(ys)) t.timeit(nwarmups)print 'parse:', t.timeit(nruns) / nruns / len(xs)print 'msg size:', sum(len(y) for y in ys) / len(ys)
以秒为单位,这段程序在我的桌面上给出了如下几个时间结果:
$ python sandbox/pbbench.py out.ini ser: 0.000434461673101 parse: 0.000602062404156 msg size: 10730 $ PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp > python sandbox/pbbench.py out.ini ser: 2.86788344383e-05 parse: 7.63910810153e-05 msg size: 10730
这显示出在序列化和转化方面分别有15和8被的速度提升。不坏!但还可以更快.
如何做让它更快
现在我们实际上只是特地针对你的PB生成了一个C++实现,而我们从来没有使用过运行时反射。首先,为你的Python项目添加一个C扩展,不如,通过修改如下的 setup.py:
setup( ... ext_modules=[Extension('podpb', sources=['cpp/podpb.c','cpp/main.pb.cc'], libraries=['protobuf'])], ... )
使用 protoc --cpp_out=cpp 生成main.pb.c, 并按如下所示创建 podpb.c 来设置一个空的 Python C 模块:
#include <Python.h> static PyMethodDef PodMethods[] = { {NULL, NULL, 0, NULL} /* Sentinel */}; PyMODINIT_FUNC initpodpb(void) { PyObject *m; m = Py_InitModule("podpb", PodMethods); if (m == NULL) return; }
现在就运行 python setup.py build 命令会构建所有的东西. 只要将C模块(在这里是podpb)导入到你的项目中,PB 运行时库就将会自动使用 C++ 实现了.
现在我们就分别有了68倍x 和 13倍 的速度提升. 吼吼.
$ PYTHONPATH=build/lib.linux-x86_64-2.6/:$PYTHONPATH > PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp > python sandbox/pbbench.py out.ini ser: 6.39575719833e-06 parse: 4.55250144005e-05 msg size: 10730
我这篇文章发布到很多地方,大事完全忘了它的存在。同时 connex.io 和 Greplin 发布了他们的原生的 Python实现,cypb和fast-python-pb。cypb在PB的邮件列表中公布过,可以运行,但仍需要提升到可用的状态。fast-python-pb目前只支持string int32, int64 双精度浮点和子消息成员。除了这些项目,其他的我都不了解。你也可以查看我的orginal thread PB邮列表来了解到这些。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]