Я полагаю, что использованная мной логика c создаст рандомизированные графики, которые вы ищете, если я не включил все требования, пожалуйста, дайте мне знать, и я удалю этот пост. Обратите внимание, что я не включил код для создания файла, так как проблема производительности, я думаю, связана со стоимостью использования функций np.random.
Исходная функция:
def generate(n=100, file='', emax=10):
data = {'n': n}
adj = np.empty(n, dtype='object')
for v in np.arange(n):
erand = np.random.randint(1, emax + 1)
adj[v] = {'v': int(v), 'e': np.random.choice(n, erand, replace=False).tolist()}
# ndarrays are not JSON serializable
data['adj'] = adj.tolist()
return data
Быстрее Функция :
def randGraph(n=100, file='', emax=10):
data = {'n': n}
nd = np.arange(n)
masks = np.array(np.hstack((np.random.randint(0, 2, (n,emax)), np.zeros((n, n-emax)))), dtype=np.bool)
for i in np.arange(n):
np.random.shuffle(masks[i])
data['adj'] = [{'v':i, 'e': nd[masks[i]].tolist()} for i in np.arange(n)]
return data
Более быстрые функции с джитом Нумбы:
from numba import jit
@jit
def randGraphJIT(n=100, file='', emax=10):
data = {'n': n}
nd = np.arange(n)
masks = np.array(np.hstack((np.random.randint(0, 2, (n,emax)), np.zeros((n, n-emax)))), dtype=np.bool)
for i in np.arange(n):
np.random.shuffle(masks[i])
data['adj'] = [{'v':i, 'e': nd[masks[i]].tolist()} for i in np.arange(n)]
return data
Результаты:
%timeit generate()
2.17 ms ± 76.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit randGraph()
663 µs ± 777 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit randGraphJIT()
284 µs ± 46.5 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Для непоследовательных графиков:
def randGraphNonSeqential(n=100, file='', emax=10):
data = {'n': n}
nd = np.arange(n)
nds = np.tile(nd, (n,1))
masks = np.array(np.hstack((np.random.randint(0, 2, (n,emax)), np.zeros((n, n-emax)))), dtype=np.bool)
for i in np.arange(n):
np.random.shuffle(nds[i])
np.random.shuffle(masks[i])
data['adj'] = [{'v':i, 'e': nds[i][masks[i]].tolist()} for i in np.arange(n)]
return data
@jit
def randGraphNonSeqentialJIT(n=100, file='', emax=10):
data = {'n': n}
nd = np.arange(n)
nds = np.tile(nd, (n,1))
masks = np.array(np.hstack((np.random.randint(0, 2, (n,emax)), np.zeros((n, n-emax)))), dtype=np.bool)
for i in np.arange(n):
np.random.shuffle(nds[i])
np.random.shuffle(masks[i])
data['adj'] = [{'v':i, 'e': nds[i][masks[i]].tolist()} for i in np.arange(n)]
return data
Только незначительное улучшение без JIT:
%timeit randGraphNonSeqential()
1.18 ms ± 6.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
все еще довольно хорошее улучшение с JIT:
%timeit randGraphNonSeqentialJIT()
380 µs ± 363 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)