john pfeiffer
  • Home
  • Categories
  • Tags
  • Archives

return namedtuple versus dictionary performance

import collections
import time

BatchResult = collections.namedtuple( 'BatchResult' , 'list , string' )

class MyObject:
    def __init__( self ):
      self.a = 'a'
      self.b = 'b'
      self.c = 1

def seed_list_objects( count ):
    mylist = list()
    for i in xrange( count ):
        mylist.append( MyObject() )
    return mylist

def seed_list_numbers( count ):
    mylist = list()
    for i in xrange( count ):
        mylist.append( i )
    return mylist

def return_tuple_numbers():
    mylist = seed_list_numbers( 10000 )
    mystring = 'string'
    return mylist,mystring

def return_tuple_objects():
    mylist = seed_list_objects( 10000 )
    mystring = 'string'
    return mylist,mystring

def return_namedtuple_numbers():
    mylist = seed_list_numbers( 10000 )
    mystring = 'string'
    batch_result = BatchResult( mylist,mystring )
    return mylist,mystring

def return_namedtuple_objects():
    mylist = seed_list_objects( 10000 )
    mystring = 'string'
    batch_result = BatchResult( mylist,mystring )
    return mylist,mystring

def return_dictionary_numbers():
    mylist = seed_list_numbers( 10000 )
    mystring = 'string'
    batch_dict = { 'list': mylist, 'string': mystring }
    return batch_dict

def return_dictionary_objects():
    mylist = seed_list_objects( 10000 )
    mystring = 'string'
    batch_dict = { 'list': mylist, 'string': mystring }
    return batch_dict


# main
repetitions = 10


start = time.time()
for k in xrange( repetitions ):
    results_dict = return_dictionary_numbers()
    mylist = results_dict[ 'list' ]
    mystring = results_dict[ 'string' ]
print '%s elements with %s in %f seconds: dictionary_numbers' % ( len( mylist ) , mystring,  time.time() - start )

start = time.time()
for k in xrange( repetitions ):
    mylist,mystring = return_namedtuple_numbers()
print '%s elements with %s in %f seconds: namedtuple numbers' % ( len( mylist ) , mystring,  time.time() - start )

start = time.time()
for k in xrange( repetitions ):
    mylist,mystring = return_tuple_numbers()
print '%s elements with %s in %f seconds: tuple numbers' % ( len( mylist ) , mystring,  time.time() - start )
print


start = time.time()
for k in xrange( repetitions ):
    results_dict = return_dictionary_objects()
    mylist = results_dict[ 'list' ]
    mystring = results_dict[ 'string' ]
print '%s elements with %s in %f seconds: dictionary objects' % ( len( mylist ) , mystring,  time.time() - start )

start = time.time()
for k in xrange( repetitions ):
    mylist,mystring = return_namedtuple_objects()
print '%s elements with %s in %f seconds: namedtuple objects' % ( len( mylist ) , mystring,  time.time() - start )

start = time.time()
for k in xrange( repetitions ):
    mylist,mystring = return_tuple_objects()
print '%s elements with %s in %f seconds: tuple objects' % ( len( mylist ) , mystring,  time.time() - start )



# 1 repetition with ubuntu 12 python 2.7.3 (presumable cpython)
# 10000 elements with string in 0.001059 seconds: dictionary_numbers
# 10000 elements with string in 0.001010 seconds: namedtuple numbers
# 10000 elements with string in 0.001096 seconds: tuple numbers

# 10000 elements with string in 0.009293 seconds: dictionary objects
# 10000 elements with string in 0.008002 seconds: namedtuple objects
# 10000 elements with string in 0.009875 seconds: tuple objects

# 100 repetitions
# 10000 elements with string in 0.091571 seconds: dictionary_numbers
# 10000 elements with string in 0.091959 seconds: namedtuple numbers
# 10000 elements with string in 0.091551 seconds: tuple numbers

# 10000 elements with string in 0.820914 seconds: dictionary objects
# 10000 elements with string in 0.849920 seconds: namedtuple objects
# 10000 elements with string in 0.857152 seconds: tuple objects

  • « return multiple values tuple breadth first search namedtuple
  • eclipse git ssh egit »

Published

Mar 17, 2013

Category

python

~394 words

Tags

  • dictionary 4
  • namedtuple 3
  • performance 6
  • python 180
  • return 3
  • versus 1