I've been looking at a lot of mapping functions today and I thought I would see how maps fare against a simple for loop.
test=[]
def tst(func):
global test
test+=[[func, func.__name__]]
return func
@tst
def convert_for1(data):
output = []
for line in data:
x,y = line.split(',')
output+=[[float(x),float(y)]]
return output
@tst
def convert_for2(data):
output = []
for line in data:
x,y = line.split(',')
output.append([float(x),float(y)])
return output
@tst
def convert_map(data):
return [list(map(float, x.split(','))) for x in data]
@tst
def convert_map2(data):
return [[i for i in map(float,x.split(','))] for x in data]
@tst
def convert_map3(data):
return [map(float, x.split(',')) for x in data]
@tst
def convert_map4(data):
return map(lambda line:map(float, line.split(',')), data)
@tst
def convert_map5(data):
return [[j for j in i] for i in map(lambda line:map(float, line.split(',')), data)]
@tst
def convert_compr(data):
return [[float(i), float(j)] for i,j in [k.split(',') for k in data]]
@tst
def convert_gener(data):
return [[float(i), float(j)] for i,j in (k.split(',') for k in data)]
@tst
def convert_list_comprehension(data):
"""This is the same as convert_map, just faster and more readable"""
return [[float(y) for y in x.split(',')] for x in data]
Well I have to admit that the code looks a lot cleaner using the mapping function.
text = """ 1,2
2,3
3,4
5,6
7,8"""
data = text.splitlines()
data = ['0.1, 0.3', '0.4, 0.5', '0.7, 0.8', '0.3, 0.9', '0.9, 0.4', '1.0, 0.9', '0.0, 0.5', '0.1, 0.8', '0.9, 0.8', '0.8, 0.6']
Checking to see that they return the same thing...
result=convert_for1(data)
print(result)
for i in test:
print(i[1], i[0](data)==result)
[[0.1, 0.3], [0.4, 0.5], [0.7, 0.8], [0.3, 0.9], [0.9, 0.4], [1.0, 0.9], [0.0, 0.5], [0.1, 0.8], [0.9, 0.8], [0.8, 0.6]] ('convert_for1', True) ('convert_for2', True) ('convert_map', True) ('convert_map2', True) ('convert_map3', True) ('convert_map4', True) ('convert_map5', True) ('convert_compr', True) ('convert_gener', True) ('convert_list_comprehension', True)
Let check on the speed now. Does few lines of code mean a faster function?
import markdown
class MD(str):
def _repr_html_(self):
return markdown.markdown(self)
for i in test:
print(i[1])
%timeit i[0](data)
convert_for1 100000 loops, best of 3: 7.7 us per loop convert_for2 100000 loops, best of 3: 7.24 us per loop convert_map 100000 loops, best of 3: 9.55 us per loop convert_map2 100000 loops, best of 3: 8.95 us per loop convert_map3 100000 loops, best of 3: 7.47 us per loop convert_map4 100000 loops, best of 3: 8.33 us per loop convert_map5 100000 loops, best of 3: 10.5 us per loop convert_compr 100000 loops, best of 3: 7.04 us per loop convert_gener 100000 loops, best of 3: 7.19 us per loop convert_list_comprehension 100000 loops, best of 3: 7.12 us per loop