#python #numpy #iteration #nonsequential
Вопрос:
Способ, которым Python выполняет итерацию по диапазону в цикле for, задается диапазоном от (0 до n). Он будет выполнять операции сначала для 0, затем для 1, 2… пока он не закончится в n, завершив цикл for. Я прав? У меня есть рабочий код, который нужно оптимизировать для скорости, он выглядит примерно так:
Phi = np.arange(0.00005, 0.000101, 0.000001)
Strip_depth = 0.001
for angle in Phi:
Neutral_axis_depth = np.arange(150, 160, 0.0001)
for xn in Neutral_axis_depth:
Sn = int(xn / Strip_depth)
x = [0] # strip center coordinates
for i in range(0, Sn - 1):
x.append(x[i] Strip_depth)
...
# and the a lot of calculations that will eventually result on C and T
...
comparison_parameter = 0.1
dif = T - C
if comparison_parameter > dif > -comparison_parameter:
# here I need to print the corresponding values of Phi, Xn , C, T and dif in a table
# but that's another question...
Моя проблема в том, что мне нужна высокая точность результата, и для этого мне нужно изменить либо шаг «strip_depth», либо шаг np.диапазона «Neutral_axis_depth», что приведет к большему количеству операций и займет больше времени.
Я подумал, что вместо последовательного выполнения итераций в Xn я мог бы сэкономить время, выбрав случайное значение в диапазоне и продолжая в зависимости от значения, например:
если разница отрицательна, я могу пренебречь значениями диапазона с этого момента, если разница положительна, я могу пренебречь значениями диапазона до этой точки
и повторите это, пока dif > comparison_parameter>. Таким образом, операция выполняется не несколько раз, а всего несколько. Другим вариантом было бы определить значения для итерации, например 1/3 диапазона, 2/3 диапазона, а затем 1/3 «оставшегося диапазона» или что-то в этом роде. В некотором смысле я определяю новый диапазон с помощью этих шагов. В любом случае, я не знаю, как это сделать…заранее спасибо за помощь.
Ответ №1:
Я не совсем понимаю, но, похоже range()
, это не лучший выбор для данного варианта использования. Если вы хотите настроить выбранное значение по мере необходимости, используйте while
пользовательская переменная, настроенная вручную:
i = 0 # initiate the custom variable
while i < Sn - 1: # instead of range()
# under normal circumstances increase `i` in each loop by 1
i = 1
# if specific conditions are met, increase the value as needed
if dif < 0:
i = 50