Python szybciej niż skompilowany Haskell?
Mam prosty skrypt napisany w Pythonie i Haskell. Odczytuje plik z 1.000.000 oddzielonych liczb całkowitych nowej linii, analizuje ten plik na listę liczb całkowitych, szybko go sortuje, a następnie zapisuje do innego posortowanego pliku. Ten plik ma ten sam format, co niesortowany. Prosty.
Oto 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>
A oto 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>
Bardzo prosty. Teraz kompiluję kod Haskella za pomocą
<code>$ ghc -O2 --make quick.hs </code>
I czas tych dwóch z:
<code>$ time ./quick $ time python qs.py </code>
Wyniki:
Haskell:
<code>real 0m10.820s user 0m10.656s sys 0m0.154s </code>
Pyton:
<code>real 0m9.888s user 0m9.669s sys 0m0.203s </code>
Jak Python może być szybszy niż natywny kod Haskell?
Dzięki
EDYTOWAĆ:
Wersja Pythona: 2.7.1Wersja GHC: 7.0.4Mac OSX, 10.7.3Intel Core i5 2,4 GHzLista wygenerowana przez
<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>
Więc wszystkie liczby są unikalne.