Python mais rápido que o compilado Haskell?
Eu tenho um script simples escrito em Python e Haskell. Ele lê um arquivo com 1.000.000 de inteiros separados por nova linha, analisa esse arquivo em uma lista de números inteiros, organiza-o rapidamente e o grava em um arquivo diferente classificado. Este arquivo tem o mesmo formato que o não classificado. Simples.
Aqui está o Haskell:
<code>quicksort :: Ord a => [a] -> [a] quicksort [] = [] quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater) where lesser = filter (< p) xs greater = filter (>= p) xs main = do file <- readFile "data" let un = lines file let f = map (\x -> read x::Int ) un let done = quicksort f writeFile "sorted" (unlines (map show done)) </code>
E aqui está o Python:
<code>def qs(ar): if len(ar) == 0: return ar p = ar[0] return qs([i for i in ar if i < p]) + [p] + qs([i for i in ar if i > p]) def read_file(fn): f = open(fn) data = f.read() f.close() return data def write_file(fn, data): f = open('sorted', 'w') f.write(data) f.close() def main(): data = read_file('data') lines = data.split('\n') lines = [int(l) for l in lines] done = qs(lines) done = [str(l) for l in done] write_file('sorted', "\n".join(done)) if __name__ == '__main__': main() </code>
Muito simples. Agora eu compilo o código Haskell com
<code>$ ghc -O2 --make quick.hs </code>
E eu tempo esses dois com:
<code>$ time ./quick $ time python qs.py </code>
Resultados:
Haskell:
<code>real 0m10.820s user 0m10.656s sys 0m0.154s </code>
Python:
<code>real 0m9.888s user 0m9.669s sys 0m0.203s </code>
Como o Python pode ser mais rápido que o código nativo Haskell?
obrigado
EDITAR:
Versão Python: 2.7.1Versão do GHC: 7.0.4Mac OSX, 10.7.3Intel Core i5 de 2,4 GHzLista gerada por
<code>from random import shuffle a = [str(a) for a in xrange(0, 1000*1000)] shuffle(a) s = "\n".join(a) f = open('data', 'w') f.write(s) f.close() </code>
Então todos os números são únicos.