リストから拡張されたクラス = が、リスト型ではなくそれ自体のスライスを返すようにしようとしています。私がこれをしたい理由は、Aのインスタンスを操作するための他の多くの方法があるからです.
私はpython 2.7.3を実行しています.
class B():
def __init__(self, t, p):
self.t = t
self.p = p
class Alist(list):
def __init__(self, a_list_of_times = []):
for a_time in a_list_of_times:
self.append(a_time )
def __getslice__(self, i, j):
return super(Alist, self).__getslice__(i,j)
def plot_me(self):
pass
# other code goes here!
alist1 = Alist()
for i in range(0, 1000000):
alist1.append(B(i, i)) # yes ten million, very large list!
alist = alist1[1000:200000] # will return a list!
alist2 = Alist(alist) # will return Alist istance
問題は、変数 b を作成する際に見られるリスト全体の再作成が非常に遅いことです (スライスに比べて)。私がやりたいことは、単純に alist のクラス (現在は list 型) を Alist に変更することです
私がしようとすると:
alist.__class__ = Alist
>>>> TypeError: __class__ assignment: only for heap types.
私自身のオブジェクトタイプに対してこれを行うことができるので、これは非常に悲しいことです. 標準ではないことは理解していますが、実行されています。 Python でのインスタンスの再クラス化。
これを回避する方法はありますか?また、オブジェクトがもう少し複雑な問題を明らかに単純化しました。主に私が見つけたのは、リストを私の Alist バージョンに作り直すのが遅いということです。そして、私はこの操作をたくさん行う必要があります(やむを得ない)。Aをリメイクする方法はありますか?またはこれを高速化するための解決策はありますか?
私のバージョンでは、約 10,000 (スライスのサイズ) のスライスを 0.07 秒で処理でき、それを私のバージョンの Alist に変換するには 3 秒かかります。