通过自动启用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第三方库


热门话题
具有泛型的对象的oop Java数组   爪哇丑陋的数字找到第1500名UVA在线评委   SpringJava。lang.IllegalStateException:自动连线批注至少需要一个参数   java为什么我的系统找不到我的属性文件?   java有没有办法让Maven同时构建1.5和1.6字节码JAR?   java通过Sailfin中的header进行操作   使用向量、距离和图形   如果提供的登录信息是错误的,为什么java控件不进入else部分和Toast?   java如何为电子商务安卓应用程序存储产品列表   java保存声音首选项Libgdx Android   java无法在测试单元中调用JpaRepository   java使用批处理更新Cassandra表中的选定列,而不将其他列值设为null   java如何在log4j2中的手动代码配置中向appender添加级别?   从ImageIO返回的java Null。读取(新的ByteArrayInputStream(bs));   java不确定如何防止此Arraylist处于可编辑状态   netbeans中的java更改清单(TrustedLibrary=true属性)   java无法使用RestTemplate和Spring数据REST发布具有关系的新实体