19个版本 (7个重大更新)
0.8.0 | 2021年3月2日 |
---|---|
0.6.0 | 2020年11月12日 |
0.5.0 | 2020年9月18日 |
0.4.0 | 2020年7月17日 |
0.0.9 | 2019年5月31日 |
#1028 in 数据结构
每月52次 下载
420KB
7.5K SLoC
retworkx
- 您可以在以下位置查看完整的渲染文档: https://retworkx.readthedocs.io/en/latest/index.html
retworkx是一个通用的Python3图库,用Rust编写,以利用Rust提供的性能和安全特性。它是作为qiskit之前(以及当前)网络x使用的替代品构建的(因此得名),但设计用于为任何Python应用程序提供高性能的通用图库。该项目最初是为了构建一个更快的有向图,用作qiskit-terra的编译器核心DAG的底层数据结构,但后来扩展到涵盖Qiskit和其他应用程序的所有图使用。
安装retworkx
retworkx发布在pypi上,因此对于x86_64、i686、ppc64le、s390x和aarch64 Linux系统、x86_64的Mac OSX以及32位和64位Windows,安装过程就像运行以下命令一样简单:
pip install retworkx
这将安装预编译的retworkx版本到您的Python环境中。
在没有预编译二进制文件的平台上安装
如果为您的系统没有发布预编译的二进制文件,您将需要从源代码构建该包。但是,要从发布的源代码包中构建该包,您需要安装rust >=1.39(以及通常包含在rust中的cargo)。您可以使用rustup(一个跨平台的Rust安装程序)来简化此过程,或者依赖其他安装方法。源代码包也发布在pypi上,因此您仍然可以运行上述命令来安装它。一旦正确安装了rust,运行
pip install retworkx
将从源代码包为您本地系统构建retworkx,并像有预构建的二进制文件一样安装它。
从源代码构建
从源代码构建retworkx的第一步是使用以下命令克隆它本地:
git clone https://github.com/Qiskit/retworkx.git
retworkx 使用 PyO3 和 setuptools-rust 构建Python接口,这使得可以使用标准的Python工具进行工作。因此,假设您已安装Rust,您可以使用 pip
容易地将 retworkx 安装到您的Python环境中。一旦您有了repo的本地克隆,将当前工作目录更改为repo的根目录。然后,您可以使用以下命令将 retworkx 安装到您的Python环境中:
pip install .
假设您的当前工作目录仍然是repo的根目录。如果不是,您可以运行
pip install $PATH_TO_REPO_ROOT
这将以相同的方式安装它。然后 retworkx 就已安装到您的本地Python环境中。不过,在进行此操作时要注意两点,首先,如果您尝试使用此方法从repo根目录运行Python,它将不会如您所期望的那样工作。由于在构建包时使用了本地的Python包装库,所以在repo根目录中存在名称冲突。只需在repo根目录外运行使用 retworkx 的Python脚本或程序即可。第二个问题是,您对Rust代码所做的任何本地更改都不会实时反映在您的Python环境中,您需要重新编译 retworkx(通过重新运行 pip install
)以使更改反映在Python环境中。
开发模式
如果您想在调试模式下构建 retworkx 并在工作更改时使用交互式调试器,可以使用 python setup.py develop
来在开发模式下构建和安装 retworkx。这将构建没有优化并且包含调试信息的 retworkx,这对于调试很有用。请注意,以这种方式安装 retworkx 会比使用 pip install
慢得多,并且仅应用于调试/开发。
值得注意的是,pip install -e
不起作用,因为它会将Python包装库链接到您的Python环境,但不会构建 retworkx 二进制文件。如果您想在调试模式下构建 retworkx,必须使用 python setup.py develop
。
使用 retworkx
安装 retworkx 后,您可以通过导入 retworkx 来使用它。所有函数和图类都位于包的根目录。例如,构建一个DAG并添加两个节点以及它们之间的边将会是:
import retworkx
my_dag = retworkx.PyDAG(cycle_check=True)
# add_node(), add_child(), and add_parent() return the node index
# The sole argument here can be any python object
root_node = my_dag.add_node("MyRoot")
# The second and third arguments can be any python object
my_dag.add_child(root_node, "AChild", ["EdgeData"])
依赖项
~8MB
~143K SLoC