2016-07-06 9 views
0

ipython環境で同じクラスを共存させる最良の方法は何ですか?ipythonのCythonとPythonクラスの共存?

PythonからCythonへの階層的な(ルートクラスから始まる)いくつかのクラスを徐々に移行したいと考えています。 両方のバージョンを(ipython envで)実行できるようにするため、パフォーマンスを比較し、必要なときにフォールバックできるようにします。

正確には私が望む方法ではないにもかかわらず、うまくいくかもしれない他のアプローチがありますか?

私の現在の実験では、まずクラスの名前を変更し、それらを別々にインポートすることから始めました。 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() 

私はすべてのclass-attr /メソッドアクセスの名前を変更する必要があるため、扱いにくいです。 また、階層を下ったら、これは私のジレンマを解決しません。

他にもこれにアプローチする方法はありますか? 私はCythonでの増分記録を意味します。


cswierczは良い点を作る:

from blah import Blah 
from cblah import Blah as cBlah 

これはOKですが、階層をサポートする修正が必要になります。 他のアイデアのためにオープンにしておきます。

+2

なぜあなたは 'import *'を使用していますか?それをやめ、あなたの問題はすぐに消え去ります。 – user2357112

+0

私は通常ファイルごとに1つのクラスを使用しています。だから問題はありません – user1019129

+1

"ファイルごとに1つのクラスを使用します" - 悪い考えです。これはここではJavaではありません。あなたは常にクラスを必要とするわけではありません。そうした場合、ファイルごとに自分自身を制限する理由はありません。 – user2357112

答えて

3

import x as yメソッドを使用して、モジュール内で定義の名前を変更できます。

# 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) 

この方法:foo.pyは機能が含まれている場合たとえば、funcbar.pyxも機能func(おそらくこれはあなたがfoo.func()のCython版を書き込もうとしている)、あなたは自分のタイミングスクリプトで次の操作を行うことができますが含まれていますfoobarモジュール内で意味のある命名規則を維持できます。

関連する問題