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
考虑到我的用例,我可以缓存解析过的对象,但我还是希望有一个更快的解决方案。在
链接的wiki页面在警告“使用libyaml(c)和PyYaml(python)”之后声明。尽管注释确实有一个错误的wikilink(应该是
PyYAML
而不是PyYaml
)。在至于性能,取决于PyYAML的安装方式,应该有CParser类,它实现了用优化的C编写的YAML解析器。虽然我认为这不能解决GIL问题,但它明显更快。下面是我在我的机器上运行的一些粗略的基准测试(AMD Athlon II X4 640,3.0GHz,8GB RAM):
首先使用默认的纯Python解析器:
与注册会计师:
^{pr2}$作为比较,pypyy使用纯Python解析器。在
对于
large.yaml
我刚在google上搜索“大型yaml文件”时发现了这个:https://gist.github.com/nrh/667383/raw/1b3ba75c939f2886f63291528df89418621548fd/large.yaml
(否则,我必须删除前几行,使其成为一个doc YAML文件山药负荷抱怨。)
编辑:
另一件要考虑的事情是使用
multiprocessing
模块而不是线程。这解决了GIL问题,但是需要更多的锅炉板代码来在进程之间进行通信。但是有许多好的库可以使多处理更容易。他们的名单很好here。在相关问题 更多 >
编程相关推荐