Porovnání výpočetního času:
Můj code:
import numpy as np
def linsp(m,n):
r=np.linspace(0,m*n-1,m*n)
return r.reshape(m,n).astype(np.int)
def passV(arr,ll,rowSpan,c):
if len(ll)< np.size(arr):
return arr[rowSpan[0]:rowSpan[1],c].tolist()
else:
return []
def passH(arr,ll,colSpan,r):
if len(ll)< np.size(arr):
return arr[r,colSpan[0]:colSpan[1]].tolist()
else:
return []
def passRH(arr,ll,rowSpan,colSpan):
ll+=passH(x,ll,colSpan,rowSpan[0])
rowSpan[0]+=1
ll+=passV(x,ll,rowSpan,colSpan[1]-1)
colSpan[1]-=1
ltmp=passH(x,ll,colSpan,rowSpan[1]-1)
ltmp.reverse()
ll+=ltmp
rowSpan[1]-=1
ltmp=passV(x,ll,rowSpan,colSpan[0])
ltmp.reverse()
ll+=ltmp
colSpan[0]+=1
return rowSpan,colSpan
def snakeNP(x):
rowSpan=[0,x.shape[0]]
colSpan=[0,x.shape[1]]
ll=[]
while len(ll)<np.size(x):
rowSpan,colSpan=passRH(x,ll,rowSpan,colSpan)
return ll
Původní kod:
def snakeOP(mya):
column = lambda a: [x[a] for x in mya]
right = lambda inside : mya[inside][inside:-1-inside]
down = lambda inside : column(len(mya[0]) - inside - 1)[inside:-1-inside]
left = lambda inside : list(reversed(mya[len(column(0)) - inside - 1]))[inside:-1-inside]
up = lambda inside : list(reversed(column(inside)))[inside:-1-inside]
output = []
inside = 0
while True:
add = right(inside) + down(inside) + left(inside) + up(inside)
if add:
output += add
inside += 1
else:
return output
Kod měnící pole:
def snakeMAP(mya):
output = []
while mya:
output.extend(mya[0])
mya = map(list, zip(*mya[1:]))[::-1]
return output
Porovnání na malém a velkém poli:
xSmall=linsp(5,5)
xxSmall=xSmall.tolist()
xLarge=linsp(100,100)
xxLarge=xLarge.tolist()
Malé pole:
%time snakeOP(xxSmall)
%time snakeMAP(xxSmall)
%time snakeNP(xSmall)
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 93 us
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 75.1 us
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 145 us
Velké pole:
%time snakeOP(xxLarge)
%time snakeMAP(xxLarge)
%time snakeNP(xLarge)
CPU times: user 4 ms, sys: 0 ns, total: 4 ms
Wall time: 4.32 ms
CPU times: user 32 ms, sys: 0 ns, total: 32 ms
Wall time: 28.8 ms
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 1.63 ms