asyaevloeva
@asyaevloeva

Как ускорить функцию на пайтоне?

есть функция
def generate_chrom(nodes_length,Adj):
    chrom = np.array([],dtype=int)
    for x in range(nodes_length):
        rand = np.random.randint(0,nodes_length)
        while Adj[x,rand] != 1:
            rand = np.random.randint(0,nodes_length)
        chrom = np.append(chrom,rand)
    return chrom

эта функция generate_chrom на небольших данных работает сносно, но на больших занимает очень много времени
пример

import numpy as np
import networkx as nx

population = 20

nodes = [0,1,2,3,4,5,6,7,8,9,10]
edges = [(0,1),(0,4),(1,2),(2,3),(1,3),(3,0),(0,2),(4,5),(5,6),(6,7),(10,8),(10,9),(8,9),(8,7),(9,7),(7,10)]

graph = nx.Graph()
graph.add_nodes_from(nodes)
graph.add_edges_from(edges)
Adj = nx.adjacency_matrix(graph)

print(Adj)

nodes_length = len(graph.nodes())
print(nodes_length)

def generate_chrom(nodes_length,Adj):
    chrom = np.array([],dtype=int)
    for x in range(nodes_length):
        rand = np.random.randint(0,nodes_length)
        while Adj[x,rand] != 1:
            rand = np.random.randint(0,nodes_length)
        chrom = np.append(chrom,rand)
    return chrom

d = [generate_chrom(nodes_length, Adj) for n in range(population)]
print(d)


подскажите как ускорить ??
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
while Adj[x,rand] != 1:
    rand = np.random.randint(0,nodes_length)


Ну проблема вот в этом, ты скакать по массиву так можешь очень долго. Почему бы не составить список индексов r для который Adj[x, r] != r, а потом сделать random.choice() из него?
Ну и далее, numpy массивы не предназначены для изменения своей длины, вот это твое chrom = np.append(chrom,rand) чётко показывает, что тебе нужен список. Если очень надо, преврати его в массив перед возвратом.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы