Это быстрее для больших N
, но может считаться мошенничеством; -)
Для полного использования квадратного корня используются все преимущества очень регулярного и повторяющегося шаблона.
def cheat(N):
values = np.sqrt(np.arange(3*N-2))
result = np.lib.stride_tricks.as_strided(values, (N, N, N), 3*values.strides)
return np.ascontiguousarray(result)
Если вы можете жить с несмежным представлением только для чтения (всеми практическими средствами), это может быть значительно быстрее:
def cheat_nc_view(N):
values = np.sqrt(np.arange(3*N-2))
return np.lib.stride_tricks.as_strided(values, (N, N, N), 3*values.strides)
Для справки:
def cheek(N):
arr = np.arange(N)
return np.sqrt(arr + arr[:,np.newaxis] + arr[:,np.newaxis,np.newaxis])
>>> np.all(cheek(20) == cheat(20))
True
>>> np.all(cheek(200) == cheat_nc_view(200))
True
Сроки:
>>> timeit(lambda: cheek(20), number=1000)
0.05387042500660755
>>> timeit(lambda: cheat(20), number=1000)
0.020798540994292125
>>> timeit(lambda: cheat_nc_view(20), number=1000)
0.010791150998556986
>>> timeit(lambda: cheek(200), number=100)
6.823299437994137
>>> timeit(lambda: cheat(200), number=100)
2.0583883369981777
>>> timeit(lambda: cheat_nc_view(200), number=100)
0.0014881940151099116