2016-07-06 4 views
0

Was ist der beste Ansatz, um die gleichen Klassen in der ipython-Umgebung koexistieren zu lassen?Cython- und Python-Klassenkoexistenz in ipython?

Ich möchte schrittweise einige Klassen in der Hierarchie (ausgehend von den Stammklassen) von Python nach Cython migrieren. Ich möchte in der Lage sein, beide Versionen laufen zu lassen (in ipython env), also kann ich die Leistung vergleichen und in der Lage sein, bei Bedarf zurückzugreifen.

Gibt es einen anderen Ansatz, der funktioniert, wenn auch nicht genau so, wie ich es möchte.

Für meine aktuellen Experimente habe ich damit begonnen, die Klassen umzubenennen und sie separat zu importieren. F.E. :

import pyximport; pyximport.install() 
from blah import * 
from c_blah import * 
b = Blah() 
cb = c_Blah() 

%timeit -n 1000 b.op() 
%timeit -n 1000 cb.op() 

das ist umständlich, weil ich alle class-attr/method Zugriffe umbenennen musste. Auch das löst mein Dilemma nicht, wenn ich in die Hierarchie gehe.

Irgendwelche anderen Ideen, wie man sich nähert? Ich meine inkrementelle Umcodierung in Cython.


cswiercz macht guten Punkt:

from blah import Blah 
from cblah import Blah as cBlah 

das ist in Ordnung, aber Hierarchie unterstützt werden Änderungen erfordern. Wird es offen für andere Ideen bleiben.

+2

Warum benutzen Sie 'import *'? Hör auf damit, und dein Problem verschwindet sofort. – user2357112

+0

Ich benutze normalerweise eine Klasse pro Datei .. also ist es egal – user1019129

+1

"Ich benutze normalerweise eine Klasse pro Datei" - auch eine schlechte Idee. Dies ist nicht Java hier. Sie brauchen nicht immer Klassen, und wenn Sie das tun, gibt es keinen Grund, sich auf einen pro Datei zu beschränken. – user2357112

Antwort

3

Sie können die Methode import x as y zum Umbenennen von Definitionen in Modulen verwenden. Zum Beispiel, wenn foo.py eine Funktion func und bar.pyx enthält enthält auch die Funktion func (vielleicht ist dies versucht, Ihnen eine Cython Version von foo.func() zu schreiben), dann können Sie das folgende in Ihr Timing Skript tun:

# separate imports 
from foo import func as func_py 
from bar import func as func_cy 

# use the code 
func_py(2.0) 
func_cy(2.0) 

Auf diese Weise Sie können ein sinnvolles Benennungsschema innerhalb der Module foo und bar beibehalten.