Regarding nparray reshape() and refcount
腾刘 via NumPy-Discussion <[email protected]>
| Newsgroups | gmane.comp.python.numeric.general |
|---|---|
| Message-ID | <CAOgYcPEpp_nxw6Y0KTx0BmgP=9wUH-0nw3H7KCr1M3tD+yqfNA@mail.gmail.com> |
Hi all,
In one of numexpr's Issue: https://github.com/pydata/numexpr/issues/521 a
user points out an unexpected behavior regarding refcount of a ndarray.
After some experiments I found that it can be replicated in a small example
(https://dpaste.com/337WPLFCM):
```
import numpy as np
import sys
A = np.arange(100)
B = A
out = B
print("real number of ref of A before del B: ", sys.getrefcount(A) - 1)
del B
print("real number of ref of A after del B: ", sys.getrefcount(A) - 1)
del out
print("real number of ref of A after del out: ", sys.getrefcount(A) - 1)
print('===========')
A1 = np.arange(100)
B1 = A1.reshape((10, 10))
print("real number of ref of A1 before del B1: ", sys.getrefcount(A1) - 1)
del B1
print("real number of ref of A1 before del B1: ", sys.getrefcount(A1) - 1)
print('===========')
A2 = np.arange(100)
B2 = A2.reshape((10, 10))
out2 = B2
print("real number of ref of A2 before del B2: ", sys.getrefcount(A2) - 1)
print("real number of ref of B2 before del B2: ", sys.getrefcount(B2) - 1)
print("real number of ref of out2 before del B2: ", sys.getrefcount(out2) -
1)
del B2
print("real number of ref of A2 after del B2: ", sys.getrefcount(A2) - 1)
print("real number of ref of out2 after del B2: ", sys.getrefcount(out2) -
1)
del out2
print("real number of ref of A2 after del out2: ", sys.getrefcount(A2) - 1)
print('===========')
A3 = np.arange(100)
B3 = A3.reshape((10, 10))
out3 = B3
print("real number of ref of A3 before del out3: ", sys.getrefcount(A3) - 1)
del out3
print("real number of ref of A3 after del out3: ", sys.getrefcount(A3) - 1)
del B3
print("real number of ref of A3 after further del B3: ",
sys.getrefcount(A3) - 1)
```
The output is:
```
❯ python test_reshape.py
real number of ref of A before del B: 3
real number of ref of A after del B: 2
real number of ref of A after del out: 1
===========
real number of ref of A1 before del B1: 2
real number of ref of A1 before del B1: 1
===========
real number of ref of A2 before del B2: 2
real number of ref of B2 before del B2: 2
real number of ref of out2 before del B2: 2
real number of ref of A2 after del B2: 2
real number of ref of out2 after del B2: 1
real number of ref of A2 after del out2: 1
===========
real number of ref of A3 before del out3: 2
real number of ref of A3 after del out3: 2
real number of ref of A3 after del B3: 1
```
It seems that B2's ref of A2 is stolen by this assignment out = B2. And In
A3 , B3 case, we deleteout first and it seems that the ref in out is
returned back to B3.
I'm not sure if this is the intended behavior and I cannot find any
material or documentation about this.
Any thoughts or suggestions would be helpful!
Teng Liu
_______________________________________________
NumPy-Discussion mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/numpy-discussion.python.org
Member address: [email protected]