Я запускаю модель на Python, и я пытаюсь ускорить время выполнения. Профилирование кода я обнаружил, что огромное количество общего времени обработки расходуется на функцию cell_in_shadow
ниже. Мне интересно, есть ли способ ускорить его?Ускорение цикла NumPy
Целью этой функции является предоставление логического ответа, указывающего, будет ли указанная ячейка в массиве NumPy затенена другой ячейкой (только в направлении x). Он делает это, отступая назад по строке, проверяя каждую ячейку на высоту, которая должна быть, чтобы сделать данную ячейку в тени. Значения в shadow_map
вычисляются другой функцией здесь не показано - для этого примера, возьмите shadow_map
быть массивом со значениями, похожих на:
[0] = 0 (not used)
[1] = 3
[2] = 7
[3] = 18
The add_x
функции используются, чтобы гарантировать, что петля индексов массива вокруг (с использованием арифметика с тактовой частотой), поскольку сетка имеет периодические границы (все, что происходит с одной стороны, снова появится на другой стороне).
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
Есть ли какие-либо конкретные строки в 'cell_in_shadow', которые тяжелее других? Вы называете 'cell_in_shadow' как можно реже? – nmichaels
Я не уверен, как определить, какие линии тяжелее других. Вы знаете, как это сделать? Я проверил все свои вызовы, и я только позвоню, когда мне это нужно. – robintw
@robintw: Вы называете 'cell_in_shadow' для каждого возможного значения' x' и 'y'? – unutbu