-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStringInterning.py
More file actions
executable file
·70 lines (53 loc) · 1.42 KB
/
StringInterning.py
File metadata and controls
executable file
·70 lines (53 loc) · 1.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Mar 24 21:48:45 2021
@author: maherme
"""
#%%
# You need to do this in a console, due to in a module optimization is done
# due a compilation happens.
a = 'hello'
b = 'hello'
print(id(a), id(b))
a == b
a is b
a = 'hello world'
b = 'hello world'
print(id(a), id(b))
a == b
a is b
#%%
# We can force the interning
import sys
a = sys.intern('hello world')
b = sys.intern('hello world')
c = 'hello world'
print(id(a), id(b), id(c))
#%%
# Let's see a difference between using is an == for comparison.
def compare_using_equals(n):
a = 'a long string that is not interned' * 200
b = 'a long string that is not interned' * 200
for i in range(n):
if a == b:
pass
def compare_using_interning(n):
a = sys.intern('a long string that is not interned' * 200)
b = sys.intern('a long string that is not interned' * 200)
for i in range(n):
if a is b:
pass
import time
start = time.perf_counter()
compare_using_equals(10_000_000)
end = time.perf_counter()
print('equality', end-start)
start = time.perf_counter()
compare_using_interning(10_000_000)
end = time.perf_counter()
print('equality', end-start)
# You can notice the difference in timing between equals and interning, think
# equals is comparing each character in the string and interning is comparing
# only a number, the memory address of each string.
#%%