PythonとHaskellの両方で書かれた簡単なスクリプトがあります。1,000,000の改行で区切られた整数を含むファイルを読み取り、そのファイルを整数のリストに解析し、すばやくソートしてから、ソートされた別のファイルに書き込みます。このファイルは、ソートされていないファイルと同じ形式です。単純。
Haskellは次のとおりです。
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))
そしてここにPythonがあります:
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()
とてもシンプルです。今、私はHaskellコードをコンパイルします
$ ghc -O2 --make quick.hs
そして、私はそれらの2つの時間を次のように計ります。
$ time ./quick
$ time python qs.py
結果:
Haskell:
real 0m10.820s
user 0m10.656s
sys 0m0.154s
Python:
real 0m9.888s
user 0m9.669s
sys 0m0.203s
PythonはどうしてネイティブコードHaskellよりも速いのでしょうか?
ありがとう
編集:
- Pythonバージョン:2.7.1
- GHCバージョン:7.0.4
- Mac OSX、10.7.3
- 2.4GHz Intel Core i5
によって生成されたリスト
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()
したがって、すべての番号は一意です。