Why is this Haskell program so much slower than an equivalent Python one?

前端 未结 3 1566
春和景丽
春和景丽 2021-02-03 17:52

As part of a programming challenge, I need to read, from stdin, a sequence of space-separated integers (on a single line), and print the sum of those integers to stdout

3条回答
  •  不要未来只要你来
    2021-02-03 18:30

    I would venture to guess that a big part of your problem is actually words. When you map read . words, what you're actually doing is this:

    1. Scan the input looking for a space, building a list of non-spaces as you go. There are a lot of different kinds of spaces, and checking any character that's not a common type of space additionally involves a foreign call to a C function (slow). I'm planning to fix this sometime, but I haven't gotten around to it yet, and even then you'll still be building and throwing away lists for no good reason, and checking for spaces when you really just want to check for digits.
    2. Read through the list of accumulated characters to try to make a number out of them. Produce the number. The accumulated list now becomes garbage.
    3. Go back to step 1.

    This is a fairly ridiculous way to proceed. I believe you can even do better using something horrible like reads, but it would make more sense to use something like ReadP. You can also try fancier sorts of things like stream-based parsing; I don't know if that will help much or not.

提交回复
热议问题