有没有最新的带有python绑定的快速YAML解析器?

2024-10-05 13:59:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

考虑到我的用例,我可以缓存解析过的对象,但我还是希望有一个更快的解决方案。在


Tags: ofyamldatetimedefoutstart建议
1条回答
网友
1楼 · 发布于 2024-10-05 13:59:01

链接的wiki页面在警告“使用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

与注册会计师:

^{pr2}$

作为比较,pypyy使用纯Python解析器。在

$ 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我刚在google上搜索“大型yaml文件”时发现了这个:

https://gist.github.com/nrh/667383/raw/1b3ba75c939f2886f63291528df89418621548fd/large.yaml

(否则,我必须删除前几行,使其成为一个doc YAML文件山药负荷抱怨。)

编辑:

另一件要考虑的事情是使用multiprocessing模块而不是线程。这解决了GIL问题,但是需要更多的锅炉板代码来在进程之间进行通信。但是有许多好的库可以使多处理更容易。他们的名单很好here。在

相关问题 更多 >

    热门问题