Я учусь использовать Numba (хотя я уже достаточно знаком с Cython). Как мне ускорить этот код? Обратите внимание, что функция возвращает список наборов из двух кортежей целых чисел. Я использую блокнот IPython. Я бы предпочел Numba Cython.
@autojit
def generateadj(width,height):
adj = {}
for y in range(height):
for x in range(width):
s = set()
if x>0:
s.add((x-1,y))
if x<width-1:
s.add((x+1,y))
if y>0:
s.add((x,y-1))
if y<height-1:
s.add((x,y+1))
adj[x,y] = s
return adj
Мне удалось написать это на Cython, но мне пришлось отказаться от способа структурирования данных. Я не люблю это. Я где-то читал в документации Numba, что он может работать с базовыми вещами, такими как списки, кортежи и т. д.
%%cython
import numpy as np
def generateadj(int width, int height):
cdef int[:,:,:,:] adj = np.zeros((width,height,4,2), np.int32)
cdef int count
for y in range(height):
for x in range(width):
count = 0
if x>0:
adj[x,y,count,0] = x-1
adj[x,y,count,1] = y
count += 1
if x<width-1:
adj[x,y,count,0] = x+1
adj[x,y,count,1] = y
count += 1
if y>0:
adj[x,y,count,0] = x
adj[x,y,count,1] = y-1
count += 1
if y<height-1:
adj[x,y,count,0] = x
adj[x,y,count,1] = y+1
count += 1
for i in range(count,4):
adj[x,y,i] = adj[x,y,0]
return adj