hash - python - 如何从hashset中添加和检索字符串的时间复杂度

``````
s1 = 'abcdefghijklmn'

s3 = 'abcdefghijklmn'

``````

``````
pool = set()

print s3 in pool # => True

print 'zzzzzzzzzz' in pool # => False

``````

https://wiki.python.org/moin/TimeComplexity

``````
import time

def make_string(c, n):

return c * n

def make_tuple(el, n):

return (el,) * n

def hashtest(gen, n):

# First compute how long generation alone takes

gen_time = time.perf_counter()

for x in range(n):

gen()

gen_time = time.perf_counter() - gen_time

# Then compute how long hashing and generation takes

hash_and_gen_time = time.perf_counter()

for x in range(n):

hash(gen())

hash_and_gen_time = time.perf_counter() - hash_and_gen_time

# Return the two

return (hash_and_gen_time, gen_time)

for gen in (make_string, make_tuple):

for obj_length in (10000, 20000, 40000):

t = f"{gen.__name__} x {obj_length}"

# Using `b'hello'.decode()` here to avoid any cached hash shenanigans

hash_and_gen_time, gen_time = hashtest(

lambda: gen(b"hello".decode(), obj_length), 10000

)

hash_time = hash_and_gen_time - gen_time

print(t, hash_time, obj_length / hash_time)

``````

``````
make_string x 10000 0.23490356100000004 42570.66158311665

make_string x 20000 0.47143921999999994 42423.284172241765

make_string x 40000 0.942087403 42458.905482254915

make_tuple x 10000 0.45578034300000025 21940.393335480014

make_tuple x 20000 0.9328520900000008 21439.62608263008

make_tuple x 40000 1.8562772150000004 21548.505620158674

``````

``````
import time

s = ('x' * 500_000_000)

t0 = time.perf_counter()

a = hash(s)

t1 = time.perf_counter()

print(t1 - t0)

t0 = time.perf_counter()

b = hash(s)

t2 = time.perf_counter()

assert a == b

print(t2 - t0)

``````

``````
0.26157095399999997

1.201999999977943e-06

``````