Как перебирать случайные или определенные значения в диапазоне? в не последовательном порядке, в Python

#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