klonowanie obiektu

0

Cześć,
Potrzebuje sklonować dany obiekt x razy.

def klonowanie(self, obiekt, j):
    for i in range(1, j+1):
        klon_obiektu = copy.deepcopy(obiekt)
        print(i, "obiekt sklonowany")
    return klon_obiektu

a = klasaA()
klonowanie(a, 5)

O ile przy robieniu jednego klonu nie miałem wątpliwości to przy robieniu kilku mam wątpliwości czy robię to dobrze. Prośba o pomoc. Z góry dzięki za pomoc.

4

Zapoznaj się z yield. Bo obecnie zakładając że sklonujesz obiekt 5-ciokrotnie. To nadal uzyskasz tylko ostatnią jego kopię w return.

def klonowanie(self, obiekt, j):
    for i in range(1, j+1):
        yield copy.deepcopy(obiekt)
        
a = klasaA()
for obj in klonowanie(a, 5):
    print(obj) 

W ten sposób dostaniesz wszystkie klony po kolei w pętli for.
Bo po co robić tyle klonów, skoro ich nie wykorzystujesz w żaden sposób, ponadto po nadpisaniu adresu do zmiennej i która będzie wskazywać na nowy obiekt, stary do którego nie ma już żadnych odwołań, albo przestanie istnieć przy kolejnej iteracji, albo w ostateczności zajmie się nim garbage collector po wyjściu z funkcji.
W ten sposób możesz te obiekty dodać choćby do jakiejś listy, na przykład tak:

objects = [ obj for obj in klonowanie(a, 5) ]
5
>>> import collections, copy

>>> def clone_slow(obj, k=1):
...     for _ in range(k):
...         yield copy.deepcopy(obj)

>>> def clone_fast(obj, k=1):
...     deepcopy = copy.deepcopy
...     memo = {}
...     for _ in range(k):
...         yield deepcopy(obj, memo)

>>> def consume(it):
...     collections.deque(it, maxlen=0)

>>> d = {i: list(range(i)) for i in range(100)}

>>> %timeit consume(clone_slow(d, 100))
477 ms ± 2.84 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

>>> %timeit consume(clone_fast(d, 100))
4.83 ms ± 31.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

>>> 
0

@Mózg:

0

Na jakiej zasadzie ta linijka działa?

Mózg napisał(a):
>>> %timeit consume(clone_slow(d, 100))
477 ms ± 2.84 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Nie mogę tego w REPLu odtworzyć

1 użytkowników online, w tym zalogowanych: 0, gości: 1