|
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. |