Je cours un modèle en Python et j'essaye d'accélérer le temps d'exécution. Grâce au profilage du code, j'ai constaté qu'une grande partie du temps de traitement total est passée dans la fonction cell_in_shadow
ci-dessous. Je me demande s'il y a moyen de l'accélérer?Accélérer la boucle NumPy
Le but de la fonction est de fournir une réponse booléenne indiquant si la cellule spécifiée dans le tableau NumPy est ombrée par une autre cellule (dans la direction x uniquement). Il le fait en reculant le long de la rangée en vérifiant chaque cellule par rapport à la hauteur qu'elle doit avoir pour rendre la cellule donnée dans l'ombre. Les valeurs shadow_map
sont calculées par une autre fonction non représentée ici - pour cet exemple, prendre shadow_map
être un tableau avec des valeurs similaires à:
[0] = 0 (not used)
[1] = 3
[2] = 7
[3] = 18
La fonction add_x
est utilisée pour faire en sorte que la boucle d'indices de tableau autour (en utilisant arithmétique de l'horloge), car la grille a des limites périodiques (tout ce qui va d'un côté réapparaîtra de l'autre côté).
def cell_in_shadow(x, y):
"""Returns True if the specified cell is in shadow, False if not."""
# Get the global variables we need
global grid
global shadow_map
global x_len
# Record the original length and move to the left
orig_x = x
x = add_x(x, -1)
while x != orig_x:
# Gets the height that's needed from the shadow_map (the array index is the distance using clock-face arithmetic)
height_needed = shadow_map[((x - orig_x) % x_len)]
if grid[y, x] - grid[y, orig_x] >= height_needed:
return True
# Go to the cell to the left
x = add_x(x, -1)
def add_x(a, b):
"""Adds the two numbers using clockface arithmetic with the x_len"""
global x_len
return (a + b) % x_len
Y a-t-il des lignes particulières dans 'cell_in_shadow' qui sont plus lourdes que d'autres? Appelles-tu 'cell_in_shadow' aussi rarement que possible? – nmichaels
Je ne sais pas trop comment savoir quelles lignes sont plus lourdes que d'autres. Sais-tu comment faire cela? J'ai vérifié tous mes appels, et je ne l'appelle que lorsque j'en ai besoin. – robintw
@robintw: Appelez-vous 'cell_in_shadow' pour toutes les valeurs possibles de' x' et 'y'? – unutbu