通过自动启用LibYAML绑定来加速PyYAML。

pylibyaml的Python项目详细描述


皮里比亚姆

pylibyaml是一个简单的Python模块,monkey将PyYAML补丁到 自动启用基于LibYAML的快速解析器和发射器,如果 已安装。

安装

要安装,请运行:

pip install pylibyaml

没有明确要求安装PyYAML或LibYAML 但是没有他们这个包裹就没用了。请参考 到PyYAML安装文档,特别是关于 安装LibYAML绑定。

使用

import yaml之前运行import pylibyaml^{str1}$,尽情享受吧!

^{pr2}$

大多数现有的代码应该不经修改就运行。任何关于 ^{{cd7>和{cd7>yaml.cyaml.CLoader和 yaml.cyaml.CDumper等价物。方便方法(safe_loadsafe_dump等)都将使用C类以及方法 用于添加解析程序、构造函数或表达式。对象 继承自YAMLObject应按预期工作。

细节

背景

PyYAML是Python的规范YAML解析器和发射器库。它 不是特别快。

LibYAML是一个用于解析和发出YAML的C库。它很快。

默认情况下设置.pyPyYAML的脚本检查LibYAML是否 如果安装了,则生成和安装LibYAML绑定。

要真正使用绑定,它们需要显式地 挑选出来的。PyYAML文档显示了 以下内容:

When LibYAML bindings are installed, you may use fast LibYAML-based parser and emitter as follows:

>>> yaml.load(stream, Loader=yaml.CLoader)
>>> yaml.dump(data, Dumper=yaml.CDumper)

In order to use LibYAML based parser and emitter, use the classes CParser and CEmitter. For instance,

from yaml import load, dump
try:
    from yaml import CLoader as Loader, CDumper as Dumper
except ImportError:
    from yaml import Loader, Dumper
# ...
data = load(stream, Loader=Loader)
# ...
output = dump(data, Dumper=Dumper)    

这种方法重复性强,不方便,而且在处理时效果不佳 第三方库也使用PyYAML。

实施

pylibyaml采用的方法是重新绑定 如果yaml模块中的装入器和转储程序 在定义各种函数和类之前。

例如,比较以下内容。

没有pylibyaml:

>>> import yaml
>>> yaml.Loader
<class 'yaml.loader.Loader'>
>>> yaml.Dumper
<class 'yaml.dumper.Dumper'>
>>> help(yaml.dump)
Help on function dump in module yaml:

dump(data, stream=None, Dumper=<class 'yaml.dumper.Dumper'>, **kwds)
    Serialize a Python object into a YAML stream.
    If stream is None, return the produced string instead.

使用pylibyaml(可以使用LibYAML绑定):

>>> import pylibyaml
>>> import yaml
>>> yaml.Loader
<class 'yaml.cyaml.CLoader'>
>>> yaml.Dumper
<class 'yaml.cyaml.CDumper'>
>>> help(yaml.dump)
Help on function dump in module yaml:

dump(data, stream=None, Dumper=<class 'yaml.cyaml.CDumper'>, **kwds)
    Serialize a Python object into a YAML stream.
    If stream is None, return the produced string instead.

请注意,顶级名称现在指向cyaml版本,并且 默认函数参数已更改。

上面的代码示例仍将在不进行修改的情况下运行,但是第二个示例 可以简化-确定最佳装载机和倾卸机的逻辑是 不再需要。

import pylibyaml
from yaml import load, dump
from yaml import Loader, Dumper
# ...
data = load(stream, Loader=Loader)
# ...
output = dump(data, Dumper=Dumper)

注意事项

这太难看了

为了需要重新绑定默认装载机和卸料机的名称 在PyYAML的__init__.py中的函数和类定义之前, 我们使用inspect来获取源代码,编辑它,然后用 importlib。目前这是可行的(PyYAML的当前版本是 5.3.1),最早可追溯到3.11,但可能并不总是如此。

LibYAML和PyYAML不能100%互换。

PyYAML docs

Note that there are some subtle (but not really significant) differences between pure Python and LibYAML based parsers and emitters.

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Docker&SeleniumJava:无法在Docker容器上运行的chrome浏览器中上载图像/文件   在python中运行java命令   Java垃圾收集器异常行为   java java是否根据底层操作系统执行字节码级优化?   java是否可以休眠自定义查询返回映射而不是列表?   java Spring引导RabbitMQ接收器Jackson反序列化到POJO   apache flex在ActionScript3中创建对象相等“HashMap”作为java HashMap   java如何在Eclipse集成中切换JProfiler启动器   缓存JSP页面结果的java最佳实践?   java集成jaxb绑定文件,使用CXF生成基于WSDL的客户端   java为什么在上传操作结束之前,客户端没有检测到HttpServletResponse的PrintWriter内容?   java在接口内创建类和在类内创建接口有什么用   java向文件写入错误Android Studio   java合并多个RealmList并对结果列表排序?   谷歌API视觉java。lang.NoSuchMethodError   java如何使用逗号分别存储每个值,然后将它们存储到单独的数组中?