Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Recommended usage of Python dictionary, functions as values

Tags:

python

I'm looking for some help understanding best practices regarding dictionaries in Python.

I have an example below:

def convert_to_celsius(temp, source):
    conversion_dict = {
        'kelvin': temp - 273.15,
        'romer': (temp - 7.5) * 40 / 21
    }
    return conversion_dict[source]


def convert_to_celsius_lambda(temp, source):
    conversion_dict = {
        'kelvin': lambda x: x - 273.15,
        'romer': lambda x: (x - 7.5) * 40 / 21
    }
    return conversion_dict[source](temp)

Obviously, the two functions achieve the same goal, but via different means. Could someone help me understand the subtle difference between the two, and what the 'best' way to go on about this would be?

like image 571
chungsangh Avatar asked Apr 15 '15 14:04

chungsangh


1 Answers

If you have both dictionaries being created inside the function, then the former will be more efficient - although the former performs two calculations when only one is needed, there is more overhead in the latter version for creating the lambdas each time it's called:

>>> import timeit
>>> setup = "from __main__ import convert_to_celsius, convert_to_celsius_lambda, convert_to_celsius_lambda_once"
>>> timeit.timeit("convert_to_celsius(100, 'kelvin')", setup=setup)
0.5716437913429102
>>> timeit.timeit("convert_to_celsius_lambda(100, 'kelvin')", setup=setup)
0.6484164544288618

However, if you move the dictionary of lambdas outside the function:

CONVERSION_DICT = {
    'kelvin': lambda x: x - 273.15,
    'romer': lambda x: (x - 7.5) * 40 / 21
}

def convert_to_celsius_lambda_once(temp, source):
    return CONVERSION_DICT[source](temp)

then the latter is more efficient, as the lambda objects are only created once, and the function only does the necessary calculation on each call:

>>> timeit.timeit("convert_to_celsius_lambda_once(100, 'kelvin')", setup=setup)
0.3904035060131186

Note that this will only be a benefit where the function is being called a lot (in this case, 1,000,000 times), so that the overhead of creating the two lambda function objects is less than the time wasted in calculating two results when only one is needed.

like image 132
jonrsharpe Avatar answered Sep 22 '22 09:09

jonrsharpe