Je suis en train d'écrire une simulation de la croissance de la population de cellules cancéreuses, et j'utilise les fonctions numpy.random pour modéliser les cellules qui acquièrent ou perdent des mutations. J'ai déterminé par le profilage que le goulot d'étranglement dans le code (environ 70% de l'exécution) est les premières lignes qui contiennent les fonctions de numpy.random. Ici, la variable num_steps
est un grand nombre, environ un million:Améliorer la vitesse des fonctions numpy.random
def simulate(mu, gamma, beta, num_steps, threshold):
mutation_num = 0 # the index of the mutation (we assume each mutation only occurs once)
population = {() : 1} # represents population: tuple of mutations and number of cells with those mutations
for epoch in range(num_steps):
next_population = {}
for mutations, size in population.items():
born = np.random.binomial(size, birth_rate)
if np.random.binomial(born, gamma):
return True
mut_loss = 0 # initializing in case variable is not created
if mutations:
mut_gain, mut_loss, mut_same = np.random.multinomial(born, [mu, beta, 1-mu-beta])
else:
mut_gain, mut_same = np.random.multinomial(born, [mu, 1-mu])
.....
Y at-il un moyen de rendre les fonctions np.random.binomial
et np.random.multinomial
courir plus vite? J'ai essayé d'utiliser Cython, mais cela n'a pas aidé.
Vous pouvez commencer par remplacer 'range' par' xrange' qui est un équivalent paresseux et voir comment cela aide; ou remplacez cela avec un certain temps et incrémenter la valeur manuellement (ce qui est effectivement la même optimisation). –
@BurhanKhalid L'observation 'range' vs.' xrange' n'est vraie que pour Python 2. Es-tu certain que OP n'utilise pas Python 3? –
J'utilise python 3. Comme je l'ai déjà mentionné, le profileur indique que le goulot d'étranglement est autour des fonctions aléatoires numpy. – Alex