---
# System prepended metadata

title: String Reverse Experiment
tags: [Experiments, Python]

---

###### tags: `Python` `Experiments`

# String Reverse Experiment

This blog will cover different ways to reverse a string in python and effective time and memory take for each method to find more optimized way.

- timeit module is used to calculate the time taken to execute function
- memory_profiler is used to get memory usage of particular function
    - memory_profile is an external module which can be installed using `pip install memory_profiler` 
    - For more details visit [link](https://pypi.org/project/memory-profiler/)

```python
from timeit import timeit
from memory_profiler import memory_usage

def str_rev(x):
    o = x[::-1]
    return o


def str_rev_concat(x):
    o = ""
    for c in x:
        o = c + o
    return o 


def str_rev_format(x):
    o = ""
    for c in x:
        o = '{}{}'.format(c,o)
    return o
    

def str_rev_reversed(x):
    return ''.join(reversed(x))


def str_rev_list(x):
    l=len(x)
    o=[None] * l
    o_idx = l-1

    for c in x:
        o[o_idx] = c
        o_idx -= 1
    
    return ''.join(o)


if __name__ == '__main__':

    print("str_rev :\n\ttime: ", timeit("str_rev('vimal')", setup="from __main__ import str_rev"))
    print("\tmemory : ", memory_usage((str_rev, {'x':'vimal'} )))

    #==============================================================================================
    print("str_rev_concat :\n\ttime: ", timeit("str_rev_concat('vimal')",
                                    setup="from __main__ import str_rev_concat"))
    print("\tmemory : ", memory_usage((str_rev_concat, {'x': 'vimal'})))

    #==============================================================================================
    print("str_rev_format :\n\ttime: ", timeit("str_rev_format('vimal')",
                                    setup="from __main__ import str_rev_format"))
    print("\tmemory : ", memory_usage((str_rev_format, {'x': 'vimal'})))

    #==============================================================================================
    print("str_rev_reversed :\n\ttime: ", timeit("str_rev_reversed('vimal')",
                                        setup="from __main__ import str_rev_reversed"))
    print("\tmemory : ", memory_usage((str_rev_reversed, {'x': 'vimal'})))

    #==============================================================================================
    print("str_rev_list :\n\ttime: ", timeit("str_rev_list('vimal')",
                                setup="from __main__ import str_rev_list"))
    print("\tmemory : ", memory_usage((str_rev_list, {'x': 'vimal'})))
```

## Output

``` python
str_rev :
        time:  0.20537829999999999
        memory :  [14.3671875, 14.3671875, 14.3671875]
str_rev_concat :
        time:  0.4885861
        memory :  [14.375, 14.37890625, 14.37890625]
str_rev_format :
        time:  2.2692567
        memory :  [14.37890625, 14.37890625, 14.37890625]
str_rev_reversed :
        time:  0.5260423000000003
        memory :  [14.3828125, 14.3828125, 14.3828125]
str_rev_list :
        time:  0.8645865999999991
        memory :  [14.38671875, 14.38671875, 14.38671875, 14.38671875]
```
**Note:** _Input for function are given as **vimal** using string of larger length will show dramastic difference in performace_

From above experiment we can conclude that slicing is the best way to reverse a string and using format to reverse a string should be considered as last option.

