In this performance of programming language article we are going to talk about some small tips which will help you in Increasing performance of your python code.

Lookup for function is costly.

Lets say we have to write a loop which will run till the length and calls upper on each string.

alist = ['a','b','c'] for item in alist: len(item)

This can be written in faster way as below:

alist = ['a','b','c'] fn = len for item in alist: fn(item)

Here we are not asking for function lookup every time instead keep the function in local scope and used it. Thus it increased our performance

Here is what I wrote for performance testing and what it returned.

import datetime alist = [ str (x) for x in range ( 10000000 )] a = datetime.datetime.now() for item in alist: len (item) b = datetime.datetime.now() print (b-a).total_seconds() a = datetime.datetime.now() fn = len for item in alist: fn(item) b = datetime.datetime.now() print (b-a).total_seconds()

What we get from here is as below.

Thus there is a difference of almost 1 sec. Thus proved.

Use map where possible.

Now we can further decrease the time by using map function. Since map function is direct implementation in C code. It runs really fast.

Here how it is done

map(len, alist)

Now the time taken for the three functions are like this

Again there is decrease in time taken.

Can we further decrease the time, lets try approach 2 and three together i.e. use local functions.

fn = len

map(len, alist)

Yes this must run fastest and it does. Here are the results.

If you want to learn data structures in python you can read the below books.

So we saw what all is happening here.

Here is the final code if you want to test it yourself.

import datetime alist = [ str (x) for x in range ( 10000000 )] a = datetime.datetime.now() for item in alist: len (item) b = datetime.datetime.now() print (b-a).total_seconds() a = datetime.datetime.now() fn = len for item in alist: fn(item) b = datetime.datetime.now() print (b-a).total_seconds() a = datetime.datetime.now() map(len, alist) b = datetime.datetime.now() print (b-a).total_seconds() a = datetime.datetime.now() fn = len map(fn, alist) b = datetime.datetime.now() print (b-a).total_seconds()

Update:

Follow the below code for python 3

import datetime alist = [str(x) for x in range(10000000)]: print("

Standard loop.") a = datetime.datetime.now() result = [] for item in alist: result.append(len(item)) b = datetime.datetime.now() print((b-a).total_seconds()) print("

Standard loop with function name in local namespace.") a = datetime.datetime.now() result = [] fn = len for item in alist: result.append(fn(item)) b = datetime.datetime.now() print((b-a).total_seconds()) print("

Using map.") a = datetime.datetime.now() result = list(map(len, alist)) b = datetime.datetime.now() print((b-a).total_seconds()) print("

Using map with function name in local namespace.") a = datetime.datetime.now() fn = len result = list(map(fn, alist)) b = datetime.datetime.now() print((b-a).total_seconds()) print("

List comprehension.") a = datetime.datetime.now() result = [len(i) for i in alist] b = datetime.datetime.now() print((b-a).total_seconds()) print("

List comprehension with name in local namespace.") a = datetime.datetime.now() fn = len result = [fn(i) for i in alist] b = datetime.datetime.now() print((b-a).total_seconds())

Result for the following is as below:

Standard loop. 1.728273 Standard loop with function name in local namespace. 1.706101 Using map. 0.539602 Using map with function name in local namespace. 0.536706 List comprehension. 0.668053 List comprehension with name in local namespace. 0.609126

Thanks to @alb1 for the update.



Tip: Whenever possible use python libraries as they are optimized for performance instead of your own implementation. Here is python standard library

Wanna read more about all these. Stay updated we will come with more such articles and subscribe

More performance articles:

How to optimize Javascript Top Points

Javascript: Understanding Repaints and Reflows for performance

Javascript: Increase Performance By handling DOM with care

Javascript: Increase Performance by handling Scopes smartly

Javascript: Increase Performance using dynamic Loading