通过自动启用LibYAML绑定来加速PyYAML。
pylibyaml的Python项目详细描述
皮里比亚姆
pylibyaml是一个简单的Python模块,monkey将PyYAML补丁到 自动启用基于LibYAML的快速解析器和发射器,如果 已安装。
安装
要安装,请运行:
pip install pylibyaml
没有明确要求安装PyYAML或LibYAML 但是没有他们这个包裹就没用了。请参考 到PyYAML安装文档,特别是关于 安装LibYAML绑定。
使用
在import yaml
之前运行import pylibyaml
^{str1}$,尽情享受吧!
大多数现有的代码应该不经修改就运行。任何关于
^{{cd7>和{cd7>yaml.cyaml.CDumper
等价物。方便方法(safe_load
,
safe_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%互换。
Note that there are some subtle (but not really significant) differences between pure Python and LibYAML based parsers and emitters.
- 项目
标签: