A
A
Alons2020-09-20 00:21:26
Python
Alons, 2020-09-20 00:21:26

Why is it faster?

Why is this

def fast_string_comparison(brand, product_name):
        product_name = product_name.split()
        exact_match_brand = list(set(brand) & set(product_name))
        if exact_match_brand:
            exclusive_matches_brand = set(brand) ^ set(exact_match_brand)
        else:
            exclusive_matches_brand = brand
        return exact_match_brand, exclusive_matches_brand

works faster than this
def fast_string_comparison(brand, product_name):
        product_name = product_name.split()
        exact_match_brand = list(set(brand) & set(product_name))
        if exact_match_brand:
            exclusive_matches_brand = set(brand) ^ set(exact_match_brand)
            return exact_match_brand, exclusive_matches_brand
        else:
            return exact_match_brand, brand

Answer the question

In order to leave comments, you need to log in

1 answer(s)
P
PashaWNN, 2020-09-20
@PashaWNN

In order to understand how this works at a low level, you can use the `dis.dis` function
first option:

>>> from dis import dis
>>>
>>> def fast_string_comparison(brand, product_name):
...         product_name = product_name.split()
...         exact_match_brand = list(set(brand) & set(product_name))
...         if exact_match_brand:
...             exclusive_matches_brand = set(brand) ^ set(exact_match_brand)
...         else:
...             exclusive_matches_brand = brand
...         return exact_match_brand, exclusive_matches_brand
...
>>> dis(fast_string_comparison)
  2           0 LOAD_FAST                1 (product_name)
              2 LOAD_METHOD              0 (split)
              4 CALL_METHOD              0
              6 STORE_FAST               1 (product_name)

  3           8 LOAD_GLOBAL              1 (list)
             10 LOAD_GLOBAL              2 (set)
             12 LOAD_FAST                0 (brand)
             14 CALL_FUNCTION            1
             16 LOAD_GLOBAL              2 (set)
             18 LOAD_FAST                1 (product_name)
             20 CALL_FUNCTION            1
             22 BINARY_AND
             24 CALL_FUNCTION            1
             26 STORE_FAST               2 (exact_match_brand)

  4          28 LOAD_FAST                2 (exact_match_brand)
             30 POP_JUMP_IF_FALSE       50

  5          32 LOAD_GLOBAL              2 (set)
             34 LOAD_FAST                0 (brand)
             36 CALL_FUNCTION            1
             38 LOAD_GLOBAL              2 (set)
             40 LOAD_FAST                2 (exact_match_brand)
             42 CALL_FUNCTION            1
             44 BINARY_XOR
             46 STORE_FAST               3 (exclusive_matches_brand)
             48 JUMP_FORWARD             4 (to 54)

  7     >>   50 LOAD_FAST                0 (brand)
             52 STORE_FAST               3 (exclusive_matches_brand)

  8     >>   54 LOAD_FAST                2 (exact_match_brand)
             56 LOAD_FAST                3 (exclusive_matches_brand)
             58 BUILD_TUPLE              2
             60 RETURN_VALUE

Second:
>>> from dis import dis
>>> def fast_string_comparison(brand, product_name):
...         product_name = product_name.split()
...         exact_match_brand = list(set(brand) & set(product_name))
...         if exact_match_brand:
...             exclusive_matches_brand = set(brand) ^ set(exact_match_brand)
...             return exact_match_brand, exclusive_matches_brand
...         else:
...             return exact_match_brand, brand
...
>>> dis(fast_string_comparison)
  2           0 LOAD_FAST                1 (product_name)
              2 LOAD_METHOD              0 (split)
              4 CALL_METHOD              0
              6 STORE_FAST               1 (product_name)

  3           8 LOAD_GLOBAL              1 (list)
             10 LOAD_GLOBAL              2 (set)
             12 LOAD_FAST                0 (brand)
             14 CALL_FUNCTION            1
             16 LOAD_GLOBAL              2 (set)
             18 LOAD_FAST                1 (product_name)
             20 CALL_FUNCTION            1
             22 BINARY_AND
             24 CALL_FUNCTION            1
             26 STORE_FAST               2 (exact_match_brand)

  4          28 LOAD_FAST                2 (exact_match_brand)
             30 POP_JUMP_IF_FALSE       56

  5          32 LOAD_GLOBAL              2 (set)
             34 LOAD_FAST                0 (brand)
             36 CALL_FUNCTION            1
             38 LOAD_GLOBAL              2 (set)
             40 LOAD_FAST                2 (exact_match_brand)
             42 CALL_FUNCTION            1
             44 BINARY_XOR
             46 STORE_FAST               3 (exclusive_matches_brand)

  6          48 LOAD_FAST                2 (exact_match_brand)
             50 LOAD_FAST                3 (exclusive_matches_brand)
             52 BUILD_TUPLE              2
             54 RETURN_VALUE

  8     >>   56 LOAD_FAST                2 (exact_match_brand)
             58 LOAD_FAST                0 (brand)
             60 BUILD_TUPLE              2
             62 RETURN_VALUE
             64 LOAD_CONST               0 (None)
             66 RETURN_VALUE
>>>

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question