2016-08-08 4 views
2

Ich habe einen Code, der unstrukturiertes Netz liest. Ich schrieb Wrapper um geometrische Objekte von sympy.geometry wie:sympy.geometry Punktklasse arbeitet langsam

class Point: 
    def __init__(self, x, y, parent_mesh): 
     self.shape = sympy.geometry.Point(x,y) 
     self.parent_mesh = parent_mesh 
     self.parent_cell = list() 

Alles funktioniert gut, aber die Initialisierung von sympy.geometry.Point braucht viel Zeit für jeden Point. Tatsächlich beendete der Code die Ausführung für Tausende von Punkten nicht. Ein in C++ geschriebener Code ist in wenigen Sekunden fertig. Ohne es ist der Code schnell genug (ich habe es entfernt und zeitlich festgelegt). Ich lese, dass ein möglicher Grund sein könnte, dass sympy.geometry Fließkommazahlen in rationals für Präzision umwandelt. Gibt es einen Weg (Flagge), um sympy.geometry zu beschleunigen, da ich keine genaue Präzision brauche?

Antwort

3

Werfen Sie einen Blick auf die Point class documentation, in einem der ersten Beispiele gesagt:

Floats werden Rational automatisch konvertiert es sei denn, das Flag False ist bewerten.

So konnten Sie eine Flagge evaluate während der Initialisierung Ihrer Point Klassen genannt passieren:

self.shape = sympy.geometry.Point(x,y, evaluate=False) 

die offenbar signalisiert, was Sie wollen.

+1

Ja, das hat das Problem gelöst. Ich hätte die Dokumentation besser lesen sollen. Vielen Dank. – Shibli

+0

Obwohl jetzt sympy.geometry.Triangle arbeitet sehr langsam und es gibt nichts über "evaluate" in diesem Fall. – Shibli

+0

"Dreieck" kann mit 3 Punkten initialisiert werden, also sollten Sie diese Punkte nicht in Rational umsetzen. –