import sys
my_var = [1,2,3]
sys.getrefcount(my_var)
>>> a = 10
>>> hex(id(a))
'0x7fb38df09490'
>>> a = 15
>>> hex(id(a))
'0x7fb38df09418'
>>> a = 10
>>> b = 10
>>> hex(id(a))
'0x7fb38df09490'
>>> hex(id(b))
'0x7fb38df09490'
List에는 append해도 아이디가 바뀌지 않음!
>>> my_list = [1,2,3]
>>> id(my_list)
4443124008
>>> my_list.append(4)
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
4443124008
+ 연산을 하면 새로운 리스트가 생기기 때문에 id값이 바뀜.
>>> my_list = [1,2,3]
>>> id(my_list)
4443244880
>>> my_list = my_list + [4]
>>> my_list
[1, 2, 3, 4]
>>> id(my_list)
4443244808
>>> a = "hi"
>>> b = "hi"
>>> id(a) == id(b)
True
>>> a = [1,2,3]
>>> b = [1,2,3]
>>> id(a) == id(b)
False
>>> a = [1,2,3]
>>> b = a
>>> id(a) == id(b)
True
>>> b.append(100)
>>> a
[1, 2, 3, 100]
>>> b
[1, 2, 3, 100]
>>> a = 10
>>> b = a
>>> a is b
True
>>> a == b
True
>>> a = 1
>>> b = 1
>>> a == b
True
>>> a is b
True
>>>
>>>
>>> a = 500
>>> b = 500
>>> a == b
True
>>> a is b
False
>>> a = [1,2,3]
>>> b = [1,2,3]
>>> a is b
False
>>> a == b
True
>>> a = "a"
>>> b = "a"
>>> a is b
True
>>> a == b
True
>>>
>>>
>>> a = "asdfj23ks"
>>> b = "asdfj23ks"
>>> a is b
True
>>> a == b
True
>>> a = 10
>>> b = 10.0
>>> a is b
False
>>> a == b
True
>>> a = 10
>>> b = 10
>>> a is b
True
>>> a = 1000
>>> b = 1000
>>> a is b
False
str형태가 아래 조건일 때(=identifiers처럼 생겼을 때) 파이썬은 interning을 한다
interning은 speed, memory optimization을 위해 파이썬이 자동으로 한다.
수동으로도 할 수 있는데, `sys.intern("hello world") 형태로 가능하다.
>>> a = "hello_world"
>>> b = "hello_world"
>>> a is b
True
>>>
>>> a = "hello world"
>>> b = "hello world"
>>> a is b
False
>>> import sys
>>> a = sys.intern("hello world")
>>> b = sys.intern("hello world")
>>> c = ("hello world")
>>> a is b
True
>>> b is c
False
import sys
import time
def compare_using_equals(n):
a = "hello world" * 200
b = "hello world" * 200
for i in range(n):
if a == b:
pass
def compare_using_interning(n):
a = sys.intern("hello world" * 200)
b = sys.intern("hello world" * 200)
for i in range(n):
if a is b:
pass
start = time.perf_counter()
compare_using_equals(30000000)
end = time.perf_counter()
print(end-start)
start = time.perf_counter()
compare_using_interning(30000000)
end = time.perf_counter()
print(end-start)
1.119146882
0.8879429629999998