Python Optimizations with Guido
Within the Python docs essays section is a wonderful article by Guido van Rossum on optimizing code with Python. You should read the whole thing but I’m highlighting the bits I found most interesting and include a Python 3 version of the working code at the end.
The specific computer science problem he tries to solve is, How do you efficiently convert a list of integers that are ASCII values into a string.
It’s fascinating to see even Guido himself reason through the problem in normal fashion, starting with a simple solution and then trying out various optimizations.
His first take is simple and elegant:
def f1(list):
string = ""
for item in list:
string = string + chr(item)
return string
>>> int_list = [97, 98, 99]
>>> f1(int_list)
'abc'
And by version 7 he’s way, way faster. The progression and the way he tests the time execution of each is particularly interesting.
Here’s the complete Python 3 code (his example is older and uses Python 2):
import time
import functools
import array
def timing(f, n, a):
print(f.__name__,)
r = range(n)
t1 = time.clock()
for i in r:
f(a)
f(a)
f(a)
f(a)
f(a)
f(a)
f(a)
f(a)
f(a)
f(a)
t2 = time.clock()
print(round(t2 - t1, 3))
def f1(list):
string = ""
for item in list:
string = string + chr(item)
return string
def f2(list):
return functools.reduce(lambda string, item: string + chr(item), list, "")
def f3(list):
string = ""
for character in map(chr, list):
string = string + character
return string
def f4(list):
string = ''
lchr = chr
for item in list:
string = string + lchr(item)
return string
def f5(list):
string = ''
for i in range(0, 256, 16): # 0, 16, 32...
s = ''
for character in map(chr, list[i:i + 16]):
s = s + character
string = string + s
return string
def f6(list):
return ''.join(map(chr, list))
def f7(list):
return array.array('B', list).tostring()
testdata = list(range(256))
print(testdata)
testfuncs = f1, f2, f3, f4, f5, f6, f7
for f in testfuncs:
print(f.__name__, f(testdata))
for f in testfuncs:
timing(f, 100, testdata)
Want to improve your Python? I have a list of recommended Python books.