Scipy.spatial.ckdtree läuft langsam

Ich habe mit spatial.cKDTree in scipy , um Abstände zwischen Punkten zu berechnen. Es ist immer sehr schnell (~ 1 s) für meine typischen Datensätze (Entfernungen für ~ 1000 Punkte zu einem Array von ~ 1e6 Punkten).

Ich laufe diesen Code in python 2.7.6 auf einem Computer mit Ubuntu 14.10. Bis zu diesem Morgen hatte ich die meisten Python-Pakete mit apt-get , einschließlich scipy und numpy . Ich wünschte up-to-date Versionen von ein paar Pakete aber, so habe ich beschlossen, Pakete in /usr/lib/python2.7/ von apt-get installiert und neu installiert alle Pakete mit pip install (kümmert sich um scipy Abhängigkeiten Wie liblapack-dev mit apt-get , wie nötig). Alles installiert und ist ohne Probleme importierbar.

 import scipy import cython scipy.__version__ '0.16.0' cython.__version__ '0.22.1' 

Jetzt läuft spatial.cKDTree auf der gleichen Größe Datensätze geht wirklich langsam. Ich sehe Laufzeit von ~ 500 s anstatt ~ 1 s. Ich habe Schwierigkeiten herauszufinden, was los ist.

Irgendwelche Vorschläge, was ich bei der Installation mit pip anstatt apt-get getan haben könnte, hätte das scipy.spatial.cKDTree so langsam laufen lassen?

  • Speed ​​Up Execution, Python
  • Ein schneller strptime
  • Warum ist [] schneller als list ()?
  • Warum ist Pythons "sortierte ()" langsamer als "Kopie, dann .sort ()"
  • Beschleunigung der Stichprobe der Kernelschätzung
  • Python, Pairwise 'Distanz', brauchen einen schnellen Weg, es zu tun
  • One Solution collect form web for “Scipy.spatial.ckdtree läuft langsam”

    In 0.16.x ich Optionen hinzugefügt, um das cKDTree mit medianen oder gleitenden Mittelpunktregeln zu bauen, sowie zu entscheiden, ob das gebundene Hyperrectangle an jedem Knoten im kd-tree neu zu berechnen ist. Die Vorgaben basieren auf Erfahrungen über die Leistung von scipy.spatial.cKDTree und sklearn.neighbors.KDTree . In einigen konstruierten Fällen (Daten, die in einer Dimension stark gestreckt werden), kann es negative Auswirkungen haben, aber normalerweise sollte es schneller sein. Experimentiere mit dem cKDTree mit balanced_tree=False und / oder compact_nodes=False . Wenn Sie auf False gibt Ihnen das gleiche Verhalten wie 0.15.x Leider ist es schwierig, Defaults zu setzen, die alle glücklich machen, weil die Leistung von den Daten abhängt.

    Beachten Sie auch, dass mit balanced_tree=True berechnen wir medians durch quickselect, wenn der kd-tree konstruiert wird. Wenn die Daten aus irgendeinem Grund vorsortiert sind, wird es sehr langsam sein. In diesem Fall wird es helfen, die Zeilen der Eingangsdaten zu mischen. Oder du kannst balanced_tree=False , um die partiellen Quicksorts zu vermeiden.

    Es gibt auch eine neue Option, um die nächstgelegene Nachfrage weiterzugeben. Versuche, query mit n_jobs=-1 und zu sehen, ob es für dich hilft.

    Python ist die beste Programmiersprache der Welt.