SORU
21 Mart 2015, CUMARTESİ


Neden bu Haskell program daha yavaş bir eşdeğer daha çok bir Python?

Programlama bir meydan okuma parçası olarak, standart girdiden, boşlukla ayrılmış tamsayılar bir dizi okumak zorundayımtek bir çizgi üzerindeve cesur. bu sayıların toplamı yazdırma Söz sırası kadar 10,000,000 tam sayılar içerebilir.

Bunun için iki çözüm var: bir Haskell ile yazılmış (foo.hs), ve başka bir eşdeğer, Python 2 (foo.py) ile yazılmış. Ne yazık ki, (derlenmiş) Haskell program Python programı daha tutarlı, daha yavaş ve bu iki program arasında performans farklılığı açıklamak için bir kayıp değilim; bkzKriteraşağıda bölüm. Eğer bir şey, üstünlük için Haskell beklerdim...

Neyi yanlış yapıyorum? Nasıl bu farkın hesabını alabilir miyim? Haskell kodumu hızlandırmanın kolay bir yolu var mı?

(Bilgi için, 8 GB RAM, DZD 7.8.4 ve Python 2.7.9.) ile mid-2010 Macbook Pro kullanıyorum

foo.hs

main = print . sum =<< getIntList

getIntList :: IO [Int]
getIntList = fmap (map read . words) getLine

(ghc -O2 foo.hs ile derlenmiş)

foo.py

ns = map(int, raw_input().split())
print sum(ns)

Kriter

Aşağıdaki, test.txt oluşur 10 milyon tek bir satır boşluk ile ayrılmış tamsayılar.

# Haskell
$ time ./foo < test.txt 
1679257

real    0m36.704s
user    0m35.932s
sys     0m0.632s

# Python
$ time python foo.py < test.txt
1679257 

real    0m7.916s
user    0m7.756s
sys     0m0.151s

CEVAP
21 Mart 2015, CUMARTESİ


read yavaş. Toplu ayrıştırma için bytestring text ilkel attoparsec kullanın.

Biraz kıyaslama yaptım. Orijinal sürümü koştu23,9bilgisayarımda saniye. Aşağıda sürümünü koştu0.35sn:

import qualified Data.ByteString.Char8 as B
import Control.Applicative
import Data.Maybe
import Data.List
import Data.Char

main = print . sum =<< getIntList

getIntList :: IO [Int]
getIntList =
    map (fst . fromJust . B.readInt) . B.words <$> B.readFile "test.txt"

test.txt dosyanıza çözümleyici uzman tarafından, çalışma zamanı için fiyatı düşürebilirim0.26sn:

getIntList :: IO [Int]          
getIntList =
    unfoldr (B.readInt . B.dropWhile (==' ')) <$> B.readFile "test.txt"

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 8lacKy

    8lacKy

    30 Mart 2009
  • iMasterful

    iMasterful

    11 EYLÜL 2009
  • The Verge

    The Verge

    8 AĞUSTOS 2006