Справочная информация
Я написал класс Python, предназначенный для вычисления времени, необходимого лучу света для распространения между двумя точками (
и term_point) в сложной среде (смоделированной с помощью параметров medium_model = [A, B, C]).
Чтобы вычислить этот свет время прохождения, нам нужны две вещи:
), launch_angle, а также начальную и конечную точки, поэтому мы можем определить последнюю, просто оптимизируя разницу между известной z-координатой терминала и тем, что мы получаем для различных значений launch_angle >.
Моя «проблема»
Мне в некоторых приложениях хотелось бы иметь возможность быстро вычислять время распространения тысячи, десятки тысяч или даже сотни тысяч лучей. Хотя этот код довольно быстр, для некоторых моих приложений он еще недостаточно быстр. Я применил все знакомые мне приемы (например, векторизацию) и значительно сократил среднее время выполнения, но все же недостаточно значительно, чтобы это было полезно для того, что мне нужно.
Мои требования следующие:
Меня не особо волнует эффективность использования памяти, только время выполнения transient_time().
Я добавляю это в базу кода, зависимостями которой являются только NumPy и SciPy. Я не могу использовать какие-либо дополнительные внешние библиотеки.
Как я могу еще больше улучшить время выполнения этого кода?
Справочная информация Я написал класс Python, предназначенный для вычисления времени, необходимого лучу света для распространения между двумя точками ([code]init_point[/code] и term_point) в сложной среде (смоделированной с помощью параметров medium_model = [A, B, C]). Чтобы вычислить этот свет время прохождения, нам нужны две вещи: [list] [*]Вышеупомянутые начальная и конечная точки. [*]Угол ([code]launch_angle[/code]), который луч света образует по оси X в начальной точке. [/list] У меня есть выражение для координаты z луч в терминах координат x и y (которые мы рассматриваем как одну координату «x» ([code]x = sqrt(x**2 + y**2)[/code]), launch_angle, а также начальную и конечную точки, поэтому мы можем определить последнюю, просто оптимизируя разницу между известной z-координатой терминала и тем, что мы получаем для различных значений launch_angle >.
Код [code]from dataclasses import dataclass import warnings import numpy as np
# Suppress warnings (sometimes there is overflow in _calculate_z_coord, etc.) warnings.filterwarnings("ignore", category=RuntimeWarning)
@dataclass class RayTracer: medium_model: np.ndarray SPEED_OF_LIGHT = 299792458 # Speed of light in m/s
def _calculate_z_coord(self, x: np.ndarray, launch_angle: np.ndarray, x0: np.ndarray, z0: np.ndarray) -> np.ndarray: """Calculate the z-coordinate based on launch angle and other parameters.""" A, B, C = self.medium_model
exp_Cz0 = np.exp(C * z0) cos_launch_angle = np.cos(launch_angle) beta = (A - B * exp_Cz0) * cos_launch_angle
sqrt_A2_beta2 = np.sqrt(A**2 - beta**2) K = C * sqrt_A2_beta2 / beta
Моя «проблема» Мне в некоторых приложениях хотелось бы иметь возможность быстро вычислять время распространения тысячи, десятки тысяч или даже сотни тысяч лучей. Хотя этот код довольно быстр, для некоторых моих приложений он еще недостаточно быстр. Я применил все знакомые мне приемы (например, векторизацию) и значительно сократил среднее время выполнения, но все же недостаточно значительно, чтобы это было полезно для того, что мне нужно. Мои требования следующие: [list] [*]Меня не особо волнует эффективность использования памяти, только время выполнения transient_time(). [*]Я добавляю это в базу кода, зависимостями которой являются только NumPy и SciPy. Я не могу использовать какие-либо дополнительные внешние библиотеки. [/list] [b]Как я могу еще больше улучшить время выполнения этого кода?[/b]
Справочная информация
Я написал класс Python, предназначенный для вычисления времени, необходимого лучу света для распространения между двумя точками ( init_point и term_point) в сложной среде (смоделированной с помощью параметров medium_model = )....
Справочная информация
Я написал класс Python, предназначенный для вычисления времени, необходимого лучу света для распространения между двумя точками ( init_point и term_point) в сложной среде (смоделированной с помощью параметров medium_model = )....
Справочная информация
Я написал класс Python, предназначенный для вычисления времени, необходимого лучу света для распространения между двумя точками ( init_point и term_point) в сложной среде (смоделированной с помощью параметров medium_model = )....
Справочная информация
Я написал класс Python, предназначенный для вычисления времени, необходимого лучу света для распространения между двумя точками ( init_point и term_point) в сложной среде (смоделированной с помощью параметров medium_model = )....
Справочная информация
Я написал класс Python, предназначенный для вычисления времени, необходимого лучу света для распространения между двумя точками ( init_point и term_point) в сложной среде (смоделированной с помощью параметров medium_model = )....