1

テスト目的で、既存のクラスにコードを追加しています。通常、このクラスはeigensystem_CUDA_implementation、その親のいくつかの関数と属性に依存しています。このクラスがプログラムの他の部分とは独立してインポートされる場合、通常の親クラスをtestParentクラスに置き換えたいと思います。

これがコードをテストするための悪い方法であり、これをまったく別の方法で行う必要がある場合、私はその提案を受け入れます。

eigensystem_CUDA_implementationオブジェクトを初期化するときのエラーは次のとおりです。

NameError:スコープを囲む際に割り当ての前に参照される自由変数'np'

ラインにさかのぼりますself.mat = np.matrix(...

表示されていない点で、NumPyとpyCUDAに依存するものは他にもたくさんありeigensystem_CUDA_implementationます。クラスは、依存するモジュールをインポートできますか?最初のエラーのため、これはまだテストされていません。

class eigensystem_CUDA_implementation:
    def __init__(self, parent = None, max_time = 60, delta = 10**(-32)):
            # For testing purposes, when class is utilized independently
            if(not parent):
                    # testing mode
                    if(not sys.modules.has_key("numpy")):
                            import numpy as np
                            import pycuda.driver as cuda
                            import pycuda.autoinit
                            from pycuda.compiler import SourceModule
                    class testParent:
                            def __init__(self, size = 10):
                                    self.size = size
                                    self.delta = 10**(-32)
                                    self.num_site_types = 8
                                    self.mat =  np.matrix(np.random.random((self.size,self.size)).astype(np.float64))
                            def get_mutation_selection_matrix(self, alpha):
                                    return self.mat
    ...

潜在的な問題の1つnot sys.modules.has_key("numpy")は、「np」という名前か他の名前かを問わず、NumPyがインポートされたものとして表示されることです。ただし、コードの残りの部分では「np」を使用しているため、これは無視しています。

提案をありがとう

4

2 に答える 2

3

numpy が既にインポートされている場合、コードは失敗します。ブロック内でのみインポートするifため、既にインポートされている場合、そのブロック内では定義されません。ただし、後で同じ関数内でnpローカル変数として参照します。

とにかく、numpy のインポートについて心配する必要はありません。import numpy as np無条件にやるだけ。すでにインポートされている場合は、インポートされたバージョンが再利用されます。メモリを無駄にしたり、2 回インポートしたりすることはありません。

とはいえ、このコードはかなり扱いにくく壊れやすいように見えます。たとえば、クラスに必要な属性をパッチする別の関数を定義するなど、これを行うためのより良い方法があるかどうかを確認する必要があります。別のクラス内のメソッド内にクラスとインポートを持つことは、かなり毛むくじゃらになっています。

于 2012-11-13T04:27:55.100 に答える
1

で行っているように、関数内にインポートを配置する__init__と、モジュールが割り当てられる変数はその関数に対してローカルになります。グローバル変数にしたい場合は、globalステートメントで明示的にグローバル変数にする必要があります。global np, cuda, SourceModuleするかもしれません。

また、 numpy は現在のモジュールではなく別のモジュールによってインポートされた可能性があるためnumpysys.modules使用する前にチェックインするだけでは不十分な場合があります。npをチェックすることもできますがnp in locals()、単純に無条件にインポートする方が簡単な場合があります。

于 2012-11-13T04:23:22.867 に答える