Hacker News new | ask | show | jobs
by worc3131 2136 days ago
It doesn't quite seem fair to compare numpy to one of the most famous K code golf's ever created, but here is my attempt, 140 characters compared to Arthur's 30, so 5 times longer. Not worry about padding the edges would cut it to 100. I don't think the gap is as wide as you think it is.

  def life(M):
    MP = np.pad(M,[(1,1),(1,1)])
    N = sum(np.roll(MP,(i,j),(0,1))
             for i in [1,0,-1]
             for j in [1,0,-1])
    return (3==N-MP*(4==N))[1:-1,1:-1]
Speedtest (presumably memory bound):

  100 x 100 matrix, numpy  0.2ms, K  0.2ms
  200 x 200 matrix, numpy  0.5ms, K  0.8ms
  500 x 500 matrix, numpy  5.2ms, K  8.0ms
  1000x1000 matrix, numpy 20.0ms, K 36.0ms
  5000x5000 matrix, numpy  0.5s , K  1.2s
Interestingly the K code is designed to return a boolean matrix, but operates much more slowly for me on a boolean matrix compared to an integer matrix, with the result that:

  q)\t klife M
Takes 1.2 seconds whilst

  q)\t klife klife M
Takes 24 seconds. So whilst the idea seems to be that klife is used with scan/over to run a number of iterations, it's actually a bad idea to run it more than once.