jdm*_*cbr 2 python performance scipy
我一直spatial.cKDTree在scipy用来计算点之间的距离.对于我的典型数据集,它总是运行得非常快(~1秒)(找到~1000点的距离到~1e6点的数组).
我在使用Ubuntu 14.10的计算机上运行python 2.7.6中的代码.直到今天早上,我已经管理了大多数python包apt-get,包括scipy和numpy.我想了最新版本的几包了,所以我决定安装包/usr/lib/python2.7/通过apt-get,并重新安装了所有软件包pip install(照顾的scipy依赖就像liblapack-dev有apt-get必要时).一切都安装好,可以导入而没有问题.
import scipy
import cython
scipy.__version__
'0.16.0'
cython.__version__
'0.22.1'
Run Code Online (Sandbox Code Playgroud)
现在,spatial.cKDTree在相同大小的数据集上运行的速度非常慢.我看到运行时间约为500秒而不是~1秒.我无法弄清楚发生了什么.
关于我在安装使用pip而不是使用它时可能做了什么的任何建议apt-get都会导致scipy.spatial.cKDTree运行速度如此之慢?
Stu*_*den 11
在0.16.x我添加了用于构建cKDTree具有中值或滑动中点规则的选项,以及选择是否重新计算kd树中每个节点处的边界超直角.默认值基于有关scipy.spatial.cKDTree和的性能的经验sklearn.neighbors.KDTree.在一些人为的情况下(沿着维度高度拉伸的数据),它可能会产生负面影响,但通常它应该更快.试验建筑cKDTree用balanced_tree=False和/或compact_nodes=False.将两者设置为与False您提供相同的行为0.15.x.不幸的是,很难设置让每个人都满意的默认值,因为性能取决于数据.
还要注意,balanced_tree=True我们在构造kd树时通过quickselect计算中位数.如果由于某种原因数据是预先排序的,那么它将非常慢.在这种情况下,它将有助于改变输入数据的行.或者您可以设置balanced_tree=False为避免部分快速排序.
还有一个新选项来多线程最近邻居查询.尝试打电话query,n_jobs=-1看看它对你有帮助.