2

リストから拡張されたクラス = が、リスト型ではなくそれ自体のスライスを返すようにしようとしています。私がこれをしたい理由は、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 秒かかります。

4

1 に答える 1

1

UserList クラス ( collectionsPython 3 で移動) は、このために完全に設計されています。それはlist他の方法ではありますが、コピーせずdataに基になるものを格納できる属性があります。list

from UserList import UserList

class Alist(UserList):
    def __init__(self, iterable, copy=True):
        if copy:
            super(Alist, self).__init__(iterable)

        else:
            self.data = iterable

    def plot_me(self):
        pass
于 2013-09-26T01:35:18.587 に答える