【问题标题】:Is there an up-to-date fast YAML parser with python bindings?是否有带有 python 绑定的最新快速 YAML 解析器?
【发布时间】:2013-05-31 19:03:45
【问题描述】:

在 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

鉴于我的用例,我可以缓存已解析的对象,但即便如此,我仍然更喜欢更快的解决方案。

【问题讨论】:

  • 嗯,我不知道 YAML 的使用率相对较低,而且不太活跃......下次可能只使用 JSON,因为我真正需要的是编码列表、数字、字符串和字典.. 我更喜欢 YAML 的外观,但是很好
  • PyYAML 有一个纯 Python 实现和一个 C 库的包装器。在进行基准测试之前,请确保 C 库可用,以便 PyYAML 可以使用它。
  • @delnan:啊,我不知道,因为该网站并没有说明这一点。我会尝试并回来查看。

标签: python performance yaml


【解决方案1】:

链接的 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

使用 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 会报错。)

编辑:

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

【讨论】:

  • 您似乎真的对 PIL 和 GIL 感到困惑。 PIL 是 Python 图像库。几乎是 Python 中几乎任何类型的图像处理的首选库。 GIL 是 Global Interpreter Lock,它是标准 python.org Python (CPython) 的实现细节,但不是 Jython 或 IronPython 等其他实现。
  • 大声笑,我知道其中的区别,一定是我的阅读障碍在起作用。感谢您的更正。 :)
猜你喜欢
  • 2016-05-16
  • 2016-12-19
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多