背景

当前要创建机器学习训练和预测算子榜单,要求打榜人员在保证效果不变的情况下,优化基础机器学习模型的训练和预测过程。例如,优化 LightGBM 库的 train 和 predict 两个阶段。

在和解决方案多次讨论后,最终将榜单的要求具体化,需要打榜人员提交一个 Python 库,通过该库可以导入一个机器学习模型包,这个包的基础功能和原生机器学习模型包的功能一样,效果如下所示。

import lightgbm_4pd as lgbm4pd
 
train_data = lgbm4pd.Dataset(X_train, y_train)
test_data = lgbm4pd.Dataset(X_test)
model = lgbmm.train(params, train_data)
model.save_model('model.txt')
model_reload = lgbm4pd.Booster('model.txt')
pred = model_reload.predict(test_data)

为此,这两天去了解了下如何写一个 Python 库。

Python 库的基本组件

Python 库的基本组件可以简化为如下几个部分,分别是 README 说明文档、setup.py 构建脚本、requirements.txt 依赖库以及代码本身。

├── lightgbm_4pd         代码目录
│   ├── __init__.py
│   └── func.py
├── requirements.txt     依赖库
├── setup.py             构建脚本
└── README.md            说明文档

其中,setup.py 定义了包的元数据和分发配置,如库的名称、版本、作者信息、依赖等等。一个简化的构建脚本可以参考如下:

from setuptools import setup, find_packages
 
with open('requirements.txt') as f:
    required = f.read().splitlines()
 
setup(
    name='myPackage', # 包名
    version='0.0.1', # 版本号
    description='An example Python package', # 描述
    author='My Name', # 作者
    author_email='my.email@example.com', # 作者邮箱
    # packages = ['lightgbm_4pd'], # 手动配置包含的包
    packages=find_packages(), # 自动发现并包含所有包和子包
    install_requires=required
)

打包 Python 库

setup.py 同级路径下执行下面命令。

python3 setup.py sdist bdist_wheel

在 Python 项目中,sdistbdist_wheel 是用来构建不同类型的分发包的命令:

  • sdist(Source Distribution): 这个命令会生成一个源代码包,通常是一个 .tar.gz 文件(在 Windows 上可能是 .zip 文件)。这个包含了源代码以及包的元数据。当其他人下载源代码包时,他们需要有相同的 Python 环境,并且可能需要编译依赖的二进制扩展。源代码包是通用的,可以在支持相应 Python 版本的任何系统中安装。

  • bdist_wheel(Built Distribution): 这个命令生成的是一个 .whl 文件,即轮子(Wheel)包。Wheel 是一种预先构建的、更快安装的分发包,它不包括项目的源代码,而是包括已经编译的扩展模块和字节码文件。Wheel 包是一个更现代的分发格式,可以提供更加快速的安装体验,因为它避免了在安装时编译代码的步骤。然而,因为轮子包是预先构建的,所以它们可能是特定于平台(Windows、macOS、Linux)的。

发布到 pip 源

略。

安装 Python 库

如果想要安装 Python 库,有几种方式。

方法一,在 setup.py 同级路径下直接安装

python setup.py install

方法二,使用 .tar.gz 文件安装

pip install xxxx.tar.gz

方法三,使用 .whl 文件安装

pip install xxxx.whl

方法四,直接通过包名从 pypi 源上安装

pip install myPackage -i {pip-source}

Backlinks:

LIST FROM [[]]