January 20, 2015

Python global variables vs classes

In programming class, the guys sitting next to me found this amazing thing, where you could setup a static class, put variables into it, and treat it as a normal variables, so that in functions, you do not need to call it via global keyword. Example:

# The 'global' class
class glo:
    val = 0

def addone(): return glo.val+1

glo.val = addone()

print glo.val

Outputs:

1

I decided to test to see if using the static class as a 'global variable' really was more efficient than using global variables in functions.

import time

# Static 'global' class
class glo:
    val = 0

gloval = 0          # A global variable

# For timing
classacctime = 0
gloacctime = 0

# For testing
trytimes = 100
upto = int(1e4)

def addoneclass():
    # Adds one to glo.val
    glo.val += 1

def addonevar():
    # Adds one to gloval
    global gloval
    gloval += 1

# Begin testing for class variable
for trys in xrange(trytimes):
    begintime = time.time()
    for i in xrange(upto):
        addoneclass()
    glo.val = 0             # Reset
    classacctime += time.time()-begintime

# Begin testing for global variable
for trys in xrange(trytimes):
    begintime = time.time()
    for i in xrange(upto):
        addonevar()
    gloval = 0              # Reset
    gloacctime += time.time()-begintime

# Print results
print "Class Test: ave: %fs, total: %fs" % (classacctime/trytimes, classacctime)
print "Variables Test: ave: %fs, total: %fs" % (gloacctime/trytimes, gloacctime)

The above code gave me the output:

Class Test: ave: 0.009418s, total: 0.941771s
Variables Test: ave: 0.007923s, total: 0.792300s

Conclusion

Don't listen to everything your friends have to say. Test first.

Tags: testing question python