使用支持 OpenMP 的查询的快速 kd-tree 实现
项目描述
pykdtree
客观的
pykdtree 是 Python 中用于快速最近邻搜索的 kd-tree 实现。目标是为树构造和查询的常见用例(低维度和低数量的邻居)提供最快的实现。
该实现基于 scipy.spatial.cKDTree 和 libANN,结合了两者的最佳特性并专注于实现效率。
该接口类似于 scipy.spatial.cKDTree 的接口,但仅支持欧几里德距离测量。
查询可选地使用 OpenMP 进行多线程处理。
安装
默认情况下,pykdtree 是使用 libgomp 使用启用了 OpenMP 的查询构建的,除了在 OSX 系统上使用 clang 编译器(conda 环境使用单独的编译器)。
$ cd <pykdtree_dir>
$ python setup.py install
如果它因未定义的编译器标志而失败,或者您想使用另一个 OpenMP 实现,请在指示点修改 setup.py 以匹配您的系统。
不支持 OpenMP 的构建由 USE_OMP 环境变量控制
$ cd <pykdtree_dir>
$ export USE_OMP=0
$ python setup.py install
注意使用 sudo 时默认情况下不会导出环境变量,因此在这种情况下,请执行
$ USE_OMP=0 sudo -E python setup.py install
Pykdtree 也可以通过 conda-forge 通道与 conda 一起安装:
$ conda install -c conda-forge pykdtree
用法
pykdtree 的用法类似于 scipy.spatial.cKDTree 所以现在参考它的文档
>>> from pykdtree.kdtree import KDTree >>> kd_tree = KDTree(data_pts) >>> dist, idx = kd_tree.query(query_pts, k=8)
可以使用标准 OpenMP 环境变量 OMP_NUM_THREADS 控制启用 OpenMP 的查询中使用的线程数。
用于树创建的leafsize参数(每片叶子的数据点数)可用于控制 kd-tree 的内存开销。pykdtree 使用默认的leafsize=16。增加叶子大小会减少内存开销和构建时间,但会增加查询时间。
pykdtree 接受双精度(numpy.float64)或单精度(numpy.float32)浮点数据。如果使用另一种类型的数据,则会进行双精度内部副本,从而导致内存开销。如果 kd 树是在单精度数据上构建的,则查询点也必须是单精度的。
基准
与 scipy.spatial.cKDTree 和 libANN 的比较。该基准针对具有 10053632 个数据点和 4276224 个查询点的地理空间 3D 数据。结果相对于 scipy.spatial.cKDTree 的构建时间进行索引。使用 10 的叶子大小(scipy.spatial.cKDTree 默认)。
注意:libANN不是线程安全的。在这个基准测试中,libANN 使用“-O3 -funroll-loops -ffast-math -fprefetch-loop-arrays”编译以达到最佳性能。
手术 |
scipy.spatial.cKDTree |
libANN |
pykdtree |
pykdtree 4 个线程 |
建造 |
100 |
304 |
96 |
96 |
查询 1 个邻居 |
1267 |
294 |
223 |
70 |
共 1 个邻居 |
1367 |
598 |
319 |
166 |
查询 8 个邻居 |
2193 |
625 |
449 |
143 |
共 8 个邻居 |
2293 |
929 |
545 |
293 |
查看组合的构造和查询,这相对于 scipy.spatial.cKDTree 提供了以下性能改进
邻居 |
libANN |
pykdtree |
pykdtree 4 个线程 |
1 |
129% |
329% |
723% |
8 |
147% |
320% |
682% |
注意:里程会因手头的数据集和计算机架构而异。
测试
使用 pytest 运行单元测试
$ cd <pykdtree_dir>
$ pytest
在 AppVeyor 上安装
Pykdtree 需要“stdint.h”头文件,该头文件在某些版本的 Windows 或某些 Windows 编译器(包括持续集成平台 AppVeyor 上的编译器)上不可用。为了解决这个问题,可以下载头文件并将其放置在正确的“包含”目录中。这可以通过将anaconda/missing-headers.ps1脚本添加到您的存储库并在appveyor.yml的安装步骤中运行它来完成:
# 安装 MSVC 2008 中未包含的缺失标头 # https://github.com/omnia-md/conda-recipes/pull/524 - “powershell ./appveyor/missing-headers.ps1”
除此之外,AppVeyor 不支持 OpenMP,因此必须通过在 环境部分的appveyor.yml中添加以下内容来关闭此功能:
- 环境:
- 全球的:
# 不要使用 openmp 构建,因为它在 appveyor 的编译器中不受支持 USE_OMP: “0”
变更日志
v1.3.5:构建 Python 3.10 轮子和其他 CI 更新
v1.3.4:修复 Python 3.9 轮子不是为 linux 构建的
v1.3.3 : 添加对 python 3.9 的兼容性
v1.3.2 : 将 OSX 安装更改为不使用没有 conda 解释器的 OpenMP
v1.3.1 : 修复 1.3.0 中引入的“查询”方法中的屏蔽
v1.3.0:关键字参数“掩码”添加到“查询”方法。OpenMP 编译现在适用于 MS Visual Studio 编译器
v1.2.2:构建过程修复
v1.2.1:修复了 v1.2.0 中引入的 OpenMP 线程安全问题
v1.2.0:添加了 64 位和 32 位 MSVC Windows 支持
v1.1.1:由于 pypi 版本不正确,与 v1.1 版本相同
v1.1:构建过程改进。为 kdtree 类添加数据属性以实现 scipy 接口兼容性
v1.0:将许可证从 GPLv3 切换到 LGPLv3
v0.3 : 避免安装 egg 的压缩
v0.2:减少内存占用。现在可以在内部处理单精度数据,避免复制转换为双精度。默认叶子大小从 10 更改为 16,因为这减少了内存占用并使其成为高速缓存行倍数(如果在基准测试中观察到任何查询性能,则可以忽略不计)。减少叶节点的内存分配。在 OS X 上构建的应用补丁。
v0.1:初始版本。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
内置发行版
pykdtree -1.3.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | d5f5acdb9c4211a45a0795b830129b9340732f1622968e0bb906aca2b089b596 |
|
| MD5 | 5fb2c2bd8561de4ce6253b632f1aba08 |
|
| 布莱克2-256 | 43f05b4865991a1cb9461be9941b26714e554c5a88bec7341d1906c7bcd8e5d7 |
pykdtree -1.3.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | a6137e8ac5bd63d178606058da46f1ac3ce7d4f6cc6eb7516400670286c34adc |
|
| MD5 | 5e52a74bb044dbe021704fcbe81bd155 |
|
| 布莱克2-256 | 3682545807ff056088d0667ce882ff1f41d1b802bdfb2e7290fa0e8754e6d814 |
pykdtree -1.3.5-cp310-cp310-macosx_10_15_x86_64.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 9fb9a5cbe91a98d38cf1ae7a6055c374763b89f7d8307255eb23a1c2f844054e |
|
| MD5 | 2299e74043058e310668231f2b3c6ba3 |
|
| 布莱克2-256 | 36e75bb84b0eb6d50303837ed259afb58f8992e86240cf05d8e730524f2ab5df |
pykdtree -1.3.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 9cc1582fcb7541cd215eec469d6e3a567df02581672cd1c9fd989baffc13be3f |
|
| MD5 | b832a37f0e59f43e30c40d5154643062 |
|
| 布莱克2-256 | f4af4bc86a2d250a2eb81c5738d71dd252931a1644f8d122a0e24bd75603b788 |