Ultimamente eu uso bastante programação funcional em python para tudo. Entretanto, fiquei brincando hoje e descobri que nem sempre ela oferece os melhores resultados.
Por exemplo, vamos imaginar a função que vai fazer todas as combinações entre os elementos de uma lista. Ela pode ser escrita de forma funcional:
# permutate-func
def permutate(l):
'''Returns all possible combinations of list values'''
return reduce(lambda x, y: y + x, [ [(x, y) for y in l if x != y] for x in l ])
ou de forma iterativa:
# permutate-iter
def permutate(l):
'''Returns all possible combinations of list values'''
res = []
for x in l:
for y in l:
if x != y:
res.append((x, y))
return res
Para listas pequenas não temos muita diferença de desempenho. Agora para listas maiores (por exemplo, com 1000 strings):
dups=['string%d' % x for x in range(1000)]
permutate(dups)
temos os seguintes resultados para programação funcional:
# time permutate-func
real 0m24.494s
user 0m20.763s
sys 0m1.698s
e os seguintes para o algoritmo iterativo:
# time permutate-iter
real 0m1.191s
user 0m1.150s
sys 0m0.036s
O tempo de 24 segundos caiu para apenas 1 segundo!
Qual conclusão tiramos disso? Embora programação funcional é extremamente poderosa, em alguns casos é melhor usar outras soluções para o problema
.