Project Icon

cloudpickle

增强Python序列化能力的跨网络工具

cloudpickle是一个扩展Python序列化功能的库,可序列化标准pickle模块不支持的Python构造。它在集群计算环境中尤为有用,能够通过网络将Python代码发送到远程主机执行。支持序列化lambda函数、交互式定义的函数和类等。cloudpickle提供pickle_by_value API,允许用户指定按值序列化的模块,提高分布式环境中的灵活性。需注意,cloudpickle仅适用于相同Python版本环境间传输对象,不支持长期对象存储。

cloudpickle

自动化测试 codecov.io

cloudpickle使得序列化Python标准库中默认pickle模块不支持的Python结构成为可能。

cloudpickle对于集群计算特别有用,在这种情况下,Python代码通过网络传送到远程主机上执行,可能靠近数据所在位置。

除此之外,cloudpickle还支持lambda函数以及在__main__模块中交互定义的函数和类的序列化(例如在脚本、shell或Jupyter笔记本中)。

Cloudpickle只能用于在完全相同版本的Python之间传送对象。

不支持且强烈不建议使用cloudpickle进行长期对象存储

安全提示:应该只加载来自可信源的pickle数据,否则pickle.load可能导致任意代码执行,造成严重的安全漏洞。

安装

cloudpickle的最新版本可以从pypi获取:

pip install cloudpickle

示例

序列化lambda表达式:

>>> import cloudpickle
>>> squared = lambda x: x ** 2
>>> pickled_lambda = cloudpickle.dumps(squared)

>>> import pickle
>>> new_squared = pickle.loads(pickled_lambda)
>>> new_squared(2)
4

序列化在Python shell会话中交互定义的函数(在__main__模块中):

>>> CONSTANT = 42
>>> def my_function(data: int) -> int:
...     return data + CONSTANT
...
>>> pickled_function = cloudpickle.dumps(my_function)
>>> depickled_function = pickle.loads(pickled_function)
>>> depickled_function
<function __main__.my_function(data:int) -> int>
>>> depickled_function(43)
85

覆盖pickle对可导入结构的序列化机制:

cloudpicklepickle之间一个重要的区别是,cloudpickle可以按值序列化函数或类,而pickle只能按引用序列化。按引用序列化将函数和类视为模块的属性,通过在加载时触发其模块导入的指令来序列化它们。因此,按引用序列化受限于假设反序列化环境中包含函数或类的模块可用/可导入。这一假设在序列化交互式会话中定义的结构时会失效,cloudpickle会自动检测这种情况,并按值序列化这些结构。

另一种预期会打破可导入性假设的情况是在分布式执行环境中开发模块时:工作进程可能无法访问该模块,例如,如果它们位于与开发模块的进程不同的机器上。cloudpickle本身无法检测这种"本地可导入"的模块并切换到按值序列化;相反,它依赖于默认模式,即按引用序列化。然而,从cloudpickle 2.0.0版本开始,可以使用register_pickle_by_value(module)/unregister_pickle_by_value(module) API明确指定应该使用按值序列化的模块:

>>> import cloudpickle
>>> import my_module
>>> cloudpickle.register_pickle_by_value(my_module)
>>> cloudpickle.dumps(my_module.my_function)  # my_function按值序列化
>>> cloudpickle.unregister_pickle_by_value(my_module)
>>> cloudpickle.dumps(my_module.my_function)  # my_function按引用序列化

使用此API,无需在所有工作节点上重新安装新版本的模块,也无需重启工作进程:仅重启带有新源代码的客户端Python进程就足够了。

请注意,这个功能仍处于实验阶段,在以下情况下可能会失败:

  • 如果按值序列化的函数/类的主体包含import语句:

    >>> def f():
    >>> ... from another_module import g
    >>> ... # 如果反序列化环境中another_module不可用,调用f可能会失败
    >>> ... return g() + 1
    
  • 如果按引用序列化的函数在执行过程中使用了按值序列化的函数。

运行测试

  • 使用tox,为所有支持的Python和PyPy版本运行测试:

    pip install tox
    tox
    

    或者针对特定环境:

    tox -e py312
    
  • 使用pytest仅运行当前Python版本的测试:

    pip install -r dev-requirements.txt
    PYTHONPATH='.:tests' pytest
    

历史

cloudpickle最初由picloud.com开发,作为客户端SDK的一部分。

cloudpickle.py的副本被包含在PySpark中,即Apache Spark的Python接口。Davies Liu、Josh Rosen、Thom Neale和其他Apache Spark开发者对其进行了显著改进,特别是增加了对PyPy和Python 3的支持。

cloudpickle项目的目标是将这项工作提供给Spark生态系统之外的更广泛受众,并通过专门的非回归测试套件使其更容易进一步改进。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号