是否有一个带有python绑定的最新快速YAML解析器?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了是否有一个带有python绑定的最新快速YAML解析器?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1788字,纯文字阅读大概需要3分钟。
内容图文
Python中快速YAML解析的最新和最好的是什么? Syck是out of date并建议使用PyYaml,但PyYaml非常慢,并且受到GIL问题的困扰:
>>> def xit(f, x):
import threading
for i in xrange(x):
threading.Thread(target=f).start()
>>> def stressit():
start = time.time()
res = yaml.load(open(path_to_11000_byte_yaml_file))
print "Took %.2fs" % (time.time() - start,)
>>> xit(stressit, 1)
Took 0.37s
>>> xit(stressit, 2)
Took 1.40s
Took 1.41s
>>> xit(stressit, 4)
Took 2.98s
Took 2.98s
Took 2.99s
Took 3.00s
鉴于我的用例,我可以缓存已解析的对象,但我仍然更喜欢更快的解决方案.
解决方法:
链接的维基页面在警告“使用libyaml(c)和PyYaml(python)”之后说明.虽然笔记确实有一个糟糕的wikilink(应该是PyYAML而不是PyYaml).
至于性能,根据你安装PyYAML的方式,你应该有CParser类可用,它实现了一个用优化的C编写的YAML解析器.虽然我认为这不会解决GIL问题,但它明显更快.以下是我在机器上运行的一些粗略基准测试(AMD Athlon II X4 640,3.0GHz,8GB RAM):
首先使用默认的纯Python解析器:
$/usr/bin/python2 -m timeit -s 'import yaml; y=file("large.yaml", "r").read()' 'yaml.load(y)'
10 loops, best of 3: 405 msec per loop
使用CParser:
$/usr/bin/python2 -m timeit -s 'import yaml; y=file("large.yaml", "r").read()' 'yaml.load(y, Loader=yaml.CLoader)'
10 loops, best of 3: 59.2 msec per loop
而且,为了比较,使用纯Python解析器与PyPy.
$pypy -m timeit -s 'import yaml; y=file("large.yaml", "r").read()' 'yaml.load(y)'
10 loops, best of 3: 101 msec per loop
对于large.yaml我只是用谷歌搜索“大yaml文件”并遇到这个:
https://gist.github.com/nrh/667383/raw/1b3ba75c939f2886f63291528df89418621548fd/large.yaml
(我不得不删除前几行以使其成为单文档YAML文件,否则yaml.load会抱怨.)
编辑:
另一件需要考虑的事情是使用多处理模块而不是线程.这解决了GIL问题,但需要更多的样板代码才能在进程之间进行通信.虽然有许多好的库可以使多处理更容易.有一个很好的清单here.
内容总结
以上是互联网集市为您收集整理的是否有一个带有python绑定的最新快速YAML解析器?全部内容,希望文章能够帮你解决是否有一个带有python绑定的最新快速YAML解析器?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。