#Day15 - The Fastest way to combine Lists in Python
Tags: python, 100daysofcode, codenewbie, programming
Published: 2021-04-04 20:16:48

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](https://cdn.hashnode.com/res/hashnode/image/upload/v1617563525334/qFjRJiqCh.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
```python
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
```python
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
```python
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
```python
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**
```python
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
```python
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](https://cdn.hashnode.com/res/hashnode/image/upload/v1617566722491/cxmbV2qD-.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