#Day15 - The Fastest way to combine Lists in Python

#Day15 - The Fastest way to combine Lists in Python

Today we will use the timeit module to try to find out the fastest way to combine a couple of Lists in Python.

We will be considering the following different ways to combine lists

  • Using the + operator
  • Using a for loop
  • Using append()
  • Using extend()
  • Unpacking with * operator
  • Using itertools.chain()

How are we going to measure the performance?

image.png

lst1 and lst2 are two lists with 1000000 random integers, we have created a function that will combine the lists in the different approaches mentioned above. This function will be called 10 times and we will measure the average time taken for each approach.

Using the + operator

def func(lst1 , lst2):
    lst3 = lst1 + lst2

Time taken

On average it took 0.01051248973235488 seconds

Output

I have used smaller lists to show the output

Input 1: [10, 3, 24, 56, 7]
Input 2: [100, 100, 200, 40, 60]
Output: [10, 3, 24, 56, 7, 100, 100, 200, 40, 60]

Using a for loop

def func(lst1 , lst2):
    lst3 = []

    for element in lst1:
        lst3.append(element)

    for element in lst2:
        lst3.append(element)

Time taken

On average it took 0.09956733733415604 seconds

Output

Input 1: [10, 3, 24, 56, 7]
Input 2: [100, 100, 200, 40, 60]
Output: [10, 3, 24, 56, 7, 100, 100, 200, 40, 60]

Using append()

Note: this is in-place, i.e unlike our previous approaches, we do not create a new list. Instead lst1 is updated

def func(lst1 , lst2):
    lst1.append(lst2)

Time taken

On average it took 6.137415766716003e-07 seconds

Output

Input 1: [10, 3, 24, 56, 7]
Input 2: [100, 100, 200, 40, 60]
After append()
Input 1: [10, 3, 24, 56, 7, [100, 100, 200, 40, 60]]
Input 2: [100, 100, 200, 40, 60]

As you can see, lst1 get's updated. Also notice unlike the previous approaches, we are not directly combining the elements of both the list. lst1 contains lst2 as an element

Using extend()

This is similar to append. It is an in-place method. The only difference being instead of adding the entire lst2 to lst1, it adds the elements of lst2 to lst1

def func(lst1 , lst2):
    lst1.extend(lst2)

Time taken

On average it took 0.01660564970225096 seconds

Output

Input 1: [10, 3, 24, 56, 7]
Input 2: [100, 100, 200, 40, 60]
After extend()
Input 1: [10, 3, 24, 56, 7, 100, 100, 200, 40, 60]
Input 2: [100, 100, 200, 40, 60]

Notice the difference in Input 1

After append()
Input 1: [10, 3, 24, 56, 7, [100, 100, 200, 40, 60]]
After extend()
Input 1: [10, 3, 24, 56, 7, 100, 100, 200, 40, 60]

Unpacking with * operator

def func(lst1 , lst2):
    lst = [*lst1,*lst2]

Time taken

On average it took 0.031204084493219854 seconds

Output

Input 1: [10, 3, 24, 56, 7]
Input 2: [100, 100, 200, 40, 60]
Output: [10, 3, 24, 56, 7, 100, 100, 200, 40, 60]

Using itertools.chain()

def func(lst1 , lst2):
    lst3 = itertools.chain(lst1,lst2)
    lst3 = list(lst3)

The chain() function returns an iterator object. We can convert it to a list by using the list() function.

Time taken

On average it took 0.028354898421093823 seconds

Output

Input 1: [10, 3, 24, 56, 7]
Input 2: [100, 100, 200, 40, 60]
Output: [10, 3, 24, 56, 7, 100, 100, 200, 40, 60]

Comparison of the approaches

image.png

append() is the fastest but it doesn't combine the elements of both the lists. The + operator seems to be the ideal option. However, this has been done on a comparatively smaller dataset and results may vary when you try it on your own.

Knowing different approaches to combine list is pretty useful and can you help you optimize your code