使用OpenMP启用查询的快速kd-tree实现
项目描述
pykdtree
目标
pykdtree是Python中用于快速最近邻搜索的kd-tree实现。目标是成为在常见用例(低维数和低邻居数)中围绕树构建和查询最快实现的之一。
实现基于scipy.spatial.cKDTree和libANN,结合了两者最佳特性,并专注于实现效率。
接口类似于scipy.spatial.cKDTree,除了只支持欧几里得距离度量。
查询可选项使用OpenMP多线程。
安装
Pykdtree可以通过pip安装
pip install pykdtree
或者,如果在一个基于conda的环境中,可以使用conda从conda-forge频道安装
conda install -c conda-forge pykdtree
注意,默认情况下,这些软件包(PyPI上的二进制车轮和conda-forge上的二进制软件包)仅针对Linux平台构建了OpenMP。要尝试带有OpenMP支持的源代码构建,请
export USE_OMP="probe"
pip install --no-binary pykdtree pykdtree
在某些没有安装OpenMP的系统上可能无法正常工作。请参阅以下开发说明以获取更多指导。通过在上面的命令中将USE_OMP设置为"0"可以禁用OpenMP。
开发安装
如果您想为pykdtree做出贡献,那么从源代码安装是一个好主意,这样您可以快速看到您的更改效果。默认情况下,pykdtree在类Unix系统上使用OpenMP启用的查询进行构建。在Linux上,这通过libgomp实现。在OSX系统上,OpenMP通过clang编译器提供(conda环境使用单独的编译器)。
$ cd <pykdtree_dir>
$ pip install -e .
这会将pykdtree安装在“可编辑”模式下,当运行新的Python解释器实例时,Python文件的变化将自动反映出来(例如,运行使用pykdtree的Python脚本)。它不会自动重新构建或重新编译pykdtree中的.mako模板和.pyx Cython代码。编辑这些文件需要运行pykdtree/render_template.py脚本,然后重新运行上面的pip命令来重新编译Cython文件。
如果安装失败,出现未定义的编译器标志或您想使用其他OpenMP实现,您可能需要修改setup.py或指定额外的pip命令行标志以匹配系统上的库位置。
不使用OpenMP支持的控制由USE_OMP环境变量控制
$ cd <pykdtree_dir>
$ export USE_OMP=0
$ pip install -e .
注意,默认情况下,使用sudo时不会导出环境变量,因此在这种情况下,请执行以下操作
$ USE_OMP=0 sudo -E pip install -e .
控制OpenMP使用
USE_OMP变量可以设置为几个不同的选项之一。如果设置为"probe",安装过程(setup.py)将尝试根据所使用的编译器、运行的平台和运行的Python环境来确定可用的OpenMP变体。然后它将使用其他USE_OMP模式之一指定的标志。请注意,在MacOS的情况下,它还将尝试识别OpenMP是否来自macports或homebrew,并包含必要的包含和库路径。
如果设置为"gcc"或"gomp",则编译器和链接标志将适当地设置为“GNU OpenMP”库。如果设置为"clang"或"omp",则标志将设置为支持“omp”库。如果设置为"msvc",则标志将设置为Microsoft Visual C++编译器的OpenMP变体。为了向后兼容,之前的"1"具有与"probe"相同的行为。如上所述,"0"可以用来禁用任何OpenMP检测或尝试编译它。
用法
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树的内存开销。pykdtree使用默认的leafsize=16。增加leafsize将减少内存开销和构建时间,但会增加查询时间。
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上的编译器)中不可用。为了解决这个问题,可以将头文件下载并放置在正确的“include”目录中。这可以通过将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的environment部分添加以下内容来关闭此功能
- 环境
- 全局
# 因为AppVeyor的编译器不支持OpenMP,所以不要使用OpenMP构建 USE_OMP: “0”
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装软件包的信息。
源分发
构建分发
pykdtree-1.3.13.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3accf852e946653e399c3d4dbbe119dbc6d3f72cfd2d5a95cabf0bf0c7f924fe |
|
MD5 | b120bff426349f7035e753dd72b9c6ff |
|
BLAKE2b-256 | 7a99a29c97c042d6978863740b1dc68dd8a1184a89667b25d947f78d0759208a |
pykdtree-1.3.13-cp313-cp313-win_arm64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 96d618fb208ecc0152877e2e74fd7428a5ed00bac32bcaf72b0d2c4ba459a1ef |
|
MD5 | 58817b3c16d859ee9cf631a6d62a8b88 |
|
BLAKE2b-256 | 4181747c88a4779f7c52adf438ce6f45b5fefb17376876c1e4070e9f5b8e3d01 |
pykdtree-1.3.13-cp313-cp313-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 83b6ef87704b04b8422fa83c427a837b4fb763715a72500a49b707c0afc50b88 |
|
MD5 | 8c096b5c6cea575e172f42a3e846b784 |
|
BLAKE2b-256 | 3e7d56441a9fa0d3e28d91d88e22fa4913943490a21b8533cd5f9c9eefdf718e |
pykdtree-1.3.13-cp313-cp313-musllinux_1_2_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9231ba4418b0b5d9f545966f52c525945436618a61d3eab0c8003d8781b48c85 |
|
MD5 | 225e2f702216a8f4bb826eee3bd8f7c8 |
|
BLAKE2b-256 | d771f093ce5a33d684ce87c34f8b563c4e6d2167098a2cc3a7ab35a6c423ed6a |
pykdtree-1.3.13-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | faaca4cda02d2b9bfcdd441e21c76e235f1a9a38f82b0702c2ac20ecbd54ca0c |
|
MD5 | ba1253b68cc95005eb1f593933e8a4f2 |
|
BLAKE2b-256 | d760efd7d393a5bf6a706e6da94097236d886421fd8c7111c359642039e86399 |
pykdtree-1.3.13-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7fd4189a9016def701635582fd4ef7ed4720954cb01d0c5fc473bf2c8329fdf0 |
|
MD5 | 5bac053be06780fb40241c84a04fd33f |
|
BLAKE2b-256 | dbbe7e9362b81a08105bb58cad02b8142381be7d2f0013c975b549ba1d1c94b4 |
pykdtree-1.3.13-cp313-cp313-macosx_12_0_x86_64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4792a2564a6f465163299ecbd7b2bf9d87c653b9c7d591a89d98843382dea1f7 |
|
MD5 | cf9dc9aa071c7ef3fd168b9ece82a995 |
|
BLAKE2b-256 | 56715b954cfa69b7f9a2462b8f10c9b9c898c7365e1cfde6e97c4d9faa57dab0 |
pykdtree-1.3.13-cp313-cp313-macosx_12_0_arm64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 953a0dda3317f34e48a08819cc614269776bb2e2286c6c4ec2e02645e03ce6b7 |
|
MD5 | ec69324b4e55a61d199eb310334abb9c |
|
BLAKE2b-256 | 6f2d1f0d4f34038985cc9ea4b2de0ce9c5880edd53eef1203d60d0a595fc6026 |
pykdtree-1.3.13-cp312-cp312-win_arm64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7f2eac6c372130afd2204443e719930cdd737d7d91b0b2be3c4f2d26f124d8b2 |
|
MD5 | f989305545064550d0eb52ccf549fe30 |
|
BLAKE2b-256 | e60a064a4c4e1539539e80da9c3f51e6c9876a24ccd8dcd4993d6f1002c5d064 |
pykdtree-1.3.13-cp312-cp312-win_amd64.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4699631cd52b7405cfc3846b65b98380fe3e47d8abc1ef13ae2f78966a0db0ad |
|
MD5 | 174d9a2cf2791fc61cecddcf6a802477 |
|
BLAKE2b-256 | cbddf1fd7b5d52294d1cd6ea422602c7999aa3e5bc811cd69df5cff6e23d3a98 |
哈希值 for pykdtree-1.3.13-cp312-cp312-musllinux_1_2_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b89455f5c1e261522cd5560b2ec03dabaacaf3b17a44fbdc5f319618c167578b |
|
MD5 | 5ab1ded36217c342e04b4b128150e418 |
|
BLAKE2b-256 | fbcc099d592f03a1edd64f14defee1de55510297e27940e62113c2c4a4bd0adb |
哈希值 for pykdtree-1.3.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8e4d03bbd6655af89eef51b0445139e3ceea65bd6addd666966423d1a0bde3c8 |
|
MD5 | 81f737a82668fc1c225b4d9c800805ce |
|
BLAKE2b-256 | 02006d9c66a025387790e356247b7ad3802e7f2d19a21b8743af8d5607736986 |
哈希值 for pykdtree-1.3.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bc5dc024bfc47f5f32eaf7ac8b2535fc374486fd33eebfe914c24e4f9177f1ed |
|
MD5 | f991047ebee64967b260f7b5ca5e8c94 |
|
BLAKE2b-256 | 64440da2940cdc2421291ee16ea0e8d29738836568313c7b83728a059c0002d0 |
哈希值 for pykdtree-1.3.13-cp312-cp312-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ded3c7a6a20b9e5eddf8a3e2ce1506d45e91f1c139f1d6de0c7028bad5bad47e |
|
MD5 | 5de2e1c49fad481464f198abe65d1599 |
|
BLAKE2b-256 | 0228b06553552d1997de4624b3e37b979d70f7a1c094359638471917ec989e3f |
哈希值 for pykdtree-1.3.13-cp312-cp312-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1ce7bb28aa469d032fe8f1a7068baba0b94bcd8da9e9b0b843c6d4c8fc6d362a |
|
MD5 | 589978729338727950ad1ef23d72b03b |
|
BLAKE2b-256 | d32734337fdde14b29359e5e98d68052ab1a1c84f83e24c1d265c592ba68ac49 |
哈希值 for pykdtree-1.3.13-cp311-cp311-musllinux_1_2_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 898c87d6ad4867d4367bccdddcebb60b2a4badb7db4886dc34d4e18442752e86 |
|
MD5 | cdd29760304e14a9ea5edb59e1e83597 |
|
BLAKE2b-256 | a835c359346e2f6f12bb902149f6351b37eeb0ad2de2c9639b154c17a57a3d63 |
哈希值 for pykdtree-1.3.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 072f71383831d4a7d1584967eb2d9fdb9832cddf704b57cec9cd886121c47fe9 |
|
MD5 | 5f772dcf82d81eaf9cee5e9cafb490de |
|
BLAKE2b-256 | ec607903143ac18cc92f4483845c2c36da1680917778cf42a95e91c9d206fa8f |
哈希值 for pykdtree-1.3.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cbd16a2612bb8d98d05151226807b7080dc9521891893409b2827514f75f295a |
|
MD5 | 84c5a30b0e6cbf4faf33c7e8bad98d99 |
|
BLAKE2b-256 | d15284ff47c0dc35a1abfe732d5debe82ba1b55c9ca53974c6d7945ca61a2508 |
哈希值 for pykdtree-1.3.13-cp311-cp311-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 642f54938605a70ca946e3d2ec0fae31082c95dc34449befdfb83349d29803db |
|
MD5 | ccb3d241a00a57b77aad35a2a0215323 |
|
BLAKE2b-256 | 787352ad2f7d84f9e13fb34b4e2716952d7b7265a9ef831e82c56b3243ce1d84 |
哈希值 for pykdtree-1.3.13-cp311-cp311-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 843d210b8489d59f97c17e11c818c9c75597d22a2b0f73cfe075f6758e7c16b9 |
|
MD5 | 3d52f5b4d59e2be9362339f5ab866669 |
|
BLAKE2b-256 | 4f3a8f1d1ab1db85fe6cc64ea0d7a9e5f64b8d945fc1bd5b7fa35c73d0a3dfa3 |
哈希值 用于 pykdtree-1.3.13-cp310-cp310-musllinux_1_2_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6cac37304c55c54f03968e6491628c8e9d7b726c29eef91e1d6112a4a1b6bc19 |
|
MD5 | efa9f7b513a1016411324b8de699c5f3 |
|
BLAKE2b-256 | fd21fc16c560599a08fed43fed9c2f742f2b493bef9f29e8420ad4729686d5dc |
哈希值 用于 pykdtree-1.3.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ddd297bdf7540d56cc0105f6f86664f16c043b308a165b44fb60b5009113771a |
|
MD5 | cc7b62c6cddfde419d6cc2494fbfbefd |
|
BLAKE2b-256 | cc491910553ddc5db1eedce380b5901d7481f5ec0dfcd51cebe932f8302316b4 |
哈希值 用于 pykdtree-1.3.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8c0c7f8b3bf58601c4cf11cae707bd445b392ed3c45a2dc0d5b15f0128befc65 |
|
MD5 | 46ed75f44b10a36707bc3c4e28d7798b |
|
BLAKE2b-256 | 1f7199086ea1320500d7012a15e8894ef238d3de298fa7ccb0852f645b7697f6 |
哈希值 用于 pykdtree-1.3.13-cp310-cp310-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 45c8015fdf514c9d1d8f989d19eefd9699c8daf3318d5a82eeee791582b445a7 |
|
MD5 | abe83c216a8f7e37af1bd8c5abf6a6a1 |
|
BLAKE2b-256 | 242c6adf8b10bcc90170598297dedb9574e744970557114691f1ae8bd1601e11 |
哈希值 用于 pykdtree-1.3.13-cp310-cp310-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7ba325679c45ebda907bf91821441818f28c02a1a3a24adc8c0fe5cf6d4a6a23 |
|
MD5 | cba3151bb632ab199c6e9068b6663bee |
|
BLAKE2b-256 | 415ef7c97558ee967e8de35e1fafb2e6e64fd12737ed70e3fc223333398cfdfe |
哈希值 用于 pykdtree-1.3.13-cp39-cp39-musllinux_1_2_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ca0b58fed5b386f01f421ca033dd267b3f3be7713270feb93af58e236da43dd8 |
|
MD5 | ec0e7bfcf62364732d11e921511dcfc6 |
|
BLAKE2b-256 | 24cca72346da7bf98efb569462624c6e364429485be4619331afc015faa55f6d |
哈希值 用于 pykdtree-1.3.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | dda9b2708317ad8907dc32e082a0528c824a2a85919c5aa5352f08737cfd1189 |
|
MD5 | 226f97dd8f24e3c8c8db04e31e169183 |
|
BLAKE2b-256 | 086f8d0a8e568933fe96c0d03b718fba02dd335138ef35e3fd2e36281d0c7f9f |
哈希值 用于 pykdtree-1.3.13-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 08302481dc40274ac5df716e4d123879823f43a223f51309379a63aadb63e406 |
|
MD5 | ee0a037261c3124527d77bbbd1161b88 |
|
BLAKE2b-256 | b2f87eeffe16715602514c6928b7bd58d730cd7d0e224061c4dce08468887ab5 |
哈希值 用于 pykdtree-1.3.13-cp39-cp39-macosx_12_0_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8a104c5d519b19f79660ea8fbc86d5d7114540d1dcccdbd6f4e7583ad4f270d5 |
|
MD5 | 9748967cda7d984fde6ea8115c947aab |
|
BLAKE2b-256 | 8885e8fc6efe673ced4421792e5961ea4bfc8be39c89c10809858234c4093122 |
哈希值 用于 pykdtree-1.3.13-cp39-cp39-macosx_12_0_arm64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 201d8171a118533efe2a8d3eb0122cabfb0151ae6ab4d5f0b07332e7f27333b7 |
|
MD5 | 056bdb8c882cdb1d54990ec738062073 |
|
BLAKE2b-256 | 2bd65e1934608a6c70363227535cd5e64e85c5fc8e955edbea77336ef74f8c2b |