NetworkX 性能基准测试指南:基于 ASV 的基准套件配置与运行实践
图计算数据分析科学计算【免费下载链接】networkxNetwork Analysis in Python项目地址https://gitcode.com/gh_mirrors/ne/networkx点击查看免费下载导读本指南围绕 NetworkX 仓库中的 benchmarks/README.md 展开系统讲解 NetworkX 如何借助 asvAirspeed Velocity搭建性能回归监控体系从基准套件的目录组织、核心基准集合的覆盖范围到asv.conf.json的每一项关键配置、基于 pixi 的一键运行方式以及asv run/asv continuous等命令行操作。读完本文你将掌握如何在本地复现 NetworkX 的性能基准、如何对比任意两个 commit 的性能差异并理解底层基准代码的构造原理可直接服务于对核心图类或算法模块的性能评估与优化提案验证。基准套件概览用 ASV 守护 NetworkX 的性能NetworkX 使用asvAirspeed Velocity来监控性能回归performance regressions并评估性能改进提案。ASV 是一个面向 Python 项目的持续基准测试框架它能够在多个 Python 版本、多组依赖组合下反复运行基准函数记录每次运行的耗时并生成跨 commit 的可视化对比结果。全部基准代码位于仓库的 benchmarks/benchmarks 子目录中。这些文件按照其关注的对象松散组织与命名有的聚焦于数据结构如四种核心图类有的聚焦于具体算法如 PageRank、强连通分量、社区发现等还有一批聚焦于特定函数或图族如distance_measures.py、benchmark_aperiodic.py、benchmark_chordal.py、benchmark_ismags.py、benchmark_hits.py、benchmark_many_components.py、benchmark_neighbors.py、benchmark_regular.py、benchmark_shortest_path.py、benchmark_to_networkx_graph.py等。套件中有两组覆盖面最广的通用基准任何涉及核心代码的改动都应关注它们benchmark_classes.py覆盖核心 NetworkX 图类Graph、DiGraph、MultiGraph、MultiDiGraph的性能测试add_node、add_edge、subgraph等基本图操作。凡是改动核心类的代码都应运行该基准以确认是否存在性能提升或回退。benchmark_algorithms.py运行一小批覆盖代码库不同部分的算法基准使用不同密度的图以及来自 SNAP 数据集的真实世界数据集来运行这些算法。benchmark_classes.py核心图类基准源码解析benchmark_classes.py 中定义的GraphBenchmark类L6-L45展示了 ASV 基准的标准写法class GraphBenchmark: params [Graph, DiGraph, MultiGraph, MultiDiGraph] param_names [graph_type] def setup(self, graph_type): self.nodes list(range(1, 1000)) self.edges [] self.subgraph_nodes list(range(1, 100)) self.subgraph_nodes_large list(range(1, 900)) self.G getattr(nx, graph_type)()params声明基准的参数组合ASV 会自动为四种图类型各跑一遍param_names则是参数在结果报告中的显示名。setup在每次计时前执行负责构造 999 个节点的测试数据其中subgraph_nodes取 99 个节点、subgraph_nodes_large取 899 个节点分别模拟小规模与大规模的子图提取。该文件通过time_*前缀的方法定义计时基准L17-L45覆盖了最常用的核心类操作基准方法被测操作说明time_graph_creategetattr(nx, graph_type)()空图构造time_add_nodes_fromself.G.add_nodes_from(self.nodes)批量加节点999 个time_add_edges_fromself.G.add_edges_from(self.edges)批量加边空边表time_remove_nodes_fromself.G.remove_nodes_from(self.nodes)批量删节点time_remove_edges_fromself.G.remove_edges_from(self.edges)批量删边time_copyself.G.copy()图复制time_to_directedself.G.to_directed()有向化转换time_to_undirectedself.G.to_undirected()无向化转换time_subgraphself.G.subgraph(self.subgraph_nodes).copy()99 节点子图提取time_subgraph_largeself.G.subgraph(self.subgraph_nodes_large).copy()899 节点子图提取benchmark_algorithms.py跨模块算法基准源码解析benchmark_algorithms.py 包含多个基准类按图的有向性与权重特征进行划分UndirectedAlgorithmBenchmarksL14-L68在三种 Erdos-Renyi 随机图100 节点边概率 p0.1/0.5/0.9外加 SNAP 药物相互作用网络Drug Interaction network上运行time_betweenness_centrality同时覆盖底层最短路径方法time_greedy_modularity_communities、time_louvain_communities社区发现time_pagerank、time_connected_components、time_k_core、time_average_clustering、time_clusteringtime_minimum_spanning_tree_kruskal指定 Kruskal 算法的最小生成树其中 Erdos-Renyi 图在模块导入时构造便宜且确定而药物相互作用网络则在setup中惰性拉取确保基准发现阶段永不依赖网络。DirectedAlgorithmBenchmarksL71-L127在 18 个有向图上运行覆盖 100/1000/10000 节点的 Erdos-Renyi 图、空图与完全图主要计时time_tarjan_scc/time_kosaraju_scc两种强连通分量算法time_clustering聚类系数AlgorithmBenchmarksConnectedGraphsOnlyL130-L155使用固定 seed42 的连通图测试eigenvector_centrality_numpy注释提到用于确保连通性检查不过度影响性能见 gh-6888、gh-7549与square_clustering。WeightedGraphBenchmarkL232-L258面向带权图的最短路径算法其图集合由 utils.py 中的weighted_graph帮助函数生成为每条边赋随机weight并包含一个构造精巧的Dijkstra 最坏情形图dijkstra_relaxation_worst_caseL196-L214对每个i j添加权重为2*(j-1-i)1的边迫使 Dijkstra 松弛全部 Θ(n²) 条边从而暴露最坏复杂度下的性能。被测方法包括time_weighted_single_source_dijkstra与time_shortest_path。utils.py基准基础设施utils.py 提供了基准公用的辅助逻辑fetch_drug_interaction_networkL66-L80惰性下载并缓存 SNAP 药物相互作用数据集若下载失败如 SNAP 暂时不可用或沙箱环境无网络则抛出NotImplementedErrorASV 只会跳过依赖它的那一个基准而非整组失败。weighted_graph为生成器产出的图添加随机边权重用于带权最短路径基准。benchmark_name_from_func_call把图生成函数 参数格式化为可读字符串作为基准结果的图标签如erdos_renyi_graph(100, 0.1)。安装与配置asv.conf.json 关键字段基准运行由 asv.conf.json 配置。当前仓库的完整配置内容如下{ version: 1, project: networkx, project_url: https://networkx.org/, repo: .., branches: [main], environment_type: rattler, conda_channels: [conda-forge], show_commit_url: http://github.com/networkx/networkx/commit/, pythons: [3.12, 3.13, 3.14], matrix: { numpy: [], scipy: [], pandas: [] } }对一个可用的 ASV 配置而言最重要的三个选项是environment_type控制 ASV 使用的环境管理工具。pythons指定基准运行期间将使用哪些 Python 版本。matrix决定基准环境安装哪些以及什么版本的依赖。默认的 rattler 后端当前 asv.conf.json 默认使用rattler环境类型pythons为[3.12, 3.13, 3.14]。ASV 通过py-rattlerpixi 所基于的同一求解器从 conda-forge 供给每个解释器及其软依赖——因此三个 Python 版本可以从单一环境出发完成基准且无需安装 conda 二进制。对应地在根目录 pyproject.toml 的[project.optional-dependencies]中benchmarking依赖组L58-L69固定了配套工具链benchmarking [ asv0.6.5, py-rattler0.21,0.22, virtualenv, ]其中的版本约束有明确背景asv ≥ 0.6.5 自带libmambapy修复与python -m build默认构建命令见 gh-7638、gh-8638而py-rattler被固定0.22是因为 asv 0.6.5 的 rattler 插件仍调用 0.22 之前版本的solve(channels...)API0.22 已将其改名为sources。切换到内置环境管理如果不想使用 rattler可切换到 ASV 内置的 virtualenv 后端environment_type: virtualenv注意使用environment_type: virtualenv时建议将pythons字段限定为系统中实际安装的那些 Python 版本否则 ASV 可能无法为缺失的解释器创建环境。限制 Python 版本与调整依赖矩阵只对单一 Python 版本运行基准pythons: [3.13]matrix字段决定基准环境中安装的可选依赖。要准确反映安装了默认软依赖的 NetworkX 性能务必在matrix中包含numpy和scipy而要评估纯 Python 代码分支则将这些依赖从matrix中移除。注意部分基准本身依赖numpy、scipy和/或pandas例如benchmark_algorithms.py中药物网络下载使用了 pandasutils.py 特意将 pandas 的导入放在函数内部以便无 pandas 时也能完成基准发现移除依赖可能导致部分基准被跳过。当前默认配置即rattler后端 Python 3.12/3.13/3.14 每个环境安装默认软依赖numpy/scipy/pandas。使用 pixi 运行基准根目录 pyproject.toml 定义了一个独立的benchmark环境L402-L405它由benchmarking特性与py313组合而成作为 rattler 的宿主环境——ASV 会在其中自行供给 3.12/3.13/3.14 三个解释器及软依赖。相关 pixi 任务定义在 L372-L379[tool.pixi.feature.benchmarking.tasks] asv-machine { cmd asv machine --yes --conf asv.conf.json, cwd benchmarks } benchmark-continuous { cmd asv continuous --split --show-stderr --factor 1.5 --conf asv.conf.json, cwd benchmarks, depends-on [asv-machine] } benchmark-run { cmd asv run --conf asv.conf.json, cwd benchmarks, depends-on [asv-machine] }因此一条命令即可运行完整基准同时覆盖 Python 3.12/3.13/3.14 三个版本与默认软依赖pixi run -e benchmark benchmark-runpixi 任务还内置了机器硬件信息探测asv-machine与 1.5 倍性能差异判定因子的连续对比benchmark-continuous。在 CI 中仓库的.github/workflows/benchmark.yml会在带有run:benchmark标签的 Pull Request 上执行该基准任务。直接调用 asv 命令行以下命令直接调用asv需要在基准环境内运行例如pixi run -e benchmark asv ...或直接使用上文所示的 pixi 任务benchmark-run、benchmark-continuous。运行当前 HEAD 的基准asv run首次运行前可能需要执行asv machine完成本机硬件性能档位标定pixi 的asv-machine任务已封装该步骤。asv run默认会对branches字段指定的分支此处为main的当前 commit 执行整套基准。对比两个 commitasv continuous base_commit_hash test_commit_hashasv continuous会在两个 commit 之间分别运行基准并给出性能对比结论回退/提升/无变化这是评估性能改进提案或排查回归的标准用法。仓库默认的 pixi 封装还附加了--split --show-stderr --factor 1.5参数。用 --bench 限定基准子集--bench标志可将一次运行限定到部分基准。例如只对比两个 commit 的算法基准asv continuous --bench AlgorithmBenchmarks sha1 sha2同一模式也可用于指定单个基准方法asv continuous --bench AlgorithmBenchmarks.time_pagerank sha1 sha2--bench接受类名、方法名以及更细粒度的模式与asv run/asv continuous配合使用可以显著缩短验证迭代周期。实际工作流建议综合上述内容一次典型的性能验证流程为发现/组织基准在 benchmarks/benchmarks 下新增benchmark_主题.py按 ASV 约定定义params、setup与time_*方法参考GraphBenchmark与各算法基准类的写法。配置环境确认 asv.conf.json 的environment_type、pythons与matrix符合验证目标评估纯 Python 分支时移除numpy/scipy等软依赖评估默认安装时保留。运行pixi run -e benchmark benchmark-run一键跑全套或pixi run -e benchmark benchmark-continuous sha1 sha2对比提交需要快速迭代时用--bench限定到相关类如GraphBenchmark或AlgorithmBenchmarks。解读依据 ASV 生成的对比报告判断性能回归或提升由于基准包含真实世界数据集SNAP 药物网络惰性下载、失败自动跳过断网环境下其余基准仍可正常完成。小结NetworkX 的性能基准体系以 benchmarks/benchmarks 下的 ASV 基准类为核心覆盖四种核心图类的基本操作与覆盖广泛模块的算法基准含 SNAP 真实数据集与 Dijkstra 最坏情形图等构造性用例以 asv.conf.json 为配置中枢默认采用 rattler 后端在 Python 3.12/3.13/3.14 三版本上供给含numpy/scipy/pandas的环境运行层面则由 pyproject.toml 中的 pixibenchmark环境与benchmark-run/benchmark-continuous任务封装配合asv run、asv continuous、--bench等命令行即可完成从单次基准到提交对比、从全量套件到子集定位的完整性能监控闭环。任何触碰核心类或算法实现的改动都可借助该套件快速获得客观、可复现的性能证据。赞分享图计算数据分析科学计算【免费下载链接】networkxNetwork Analysis in Python项目地址https://gitcode.com/gh_mirrors/ne/networkx点击查看免费下载相关推荐Formation项目深度解析从新手到专家的10个核心功能Formation项目深度解析从新手到专家的10个核心功能 Formation是一个macOS前端开发环境自动化配置脚本专为设计师和开发者打造。这个强大的自数据工程工作流自动化PySpark 基准测试实战用 ASV 编写、运行与回归对比 PySpark 微基准PySpark 基准测试实战用 ASV 编写、运行与回归对比 PySpark 微基准 本指南以 Apache Spark 仓库中 python/benchma大数据数据分析批处理流处理机器学习图计算Ruby 基准测试指南使用 benchmark-driver 运行 ruby/benchmark 基准套件Ruby 基准测试指南使用 benchmark driver 运行 ruby/benchmark 基准套件 本指南以 benchmark/README.md编程语言语言运行时解释器编译器标准库JIT编译上一篇如何快速部署Apache ArrowDocker与K8s实践指南下一篇Apache Druid HTTP客户端终极指南自定义SSL配置与网络扩展开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考