Эффективный расчет двойного суммирования с потоком управления

avatar
pchatziko
8 августа 2021 в 19:31
29
1
0

Я пытаюсь вычислить следующую двойную сумму, которая вычисляет вероятность того, что кто-то финиширует вторым в какой-то гонке, учитывая, что у нас есть шанс, что человек финиширует первым. X — длина списка бегунов, а также n!=i

Следующий код работает

def Scnd(mylist=[]):
          
    sec=[]
    for seconds in range(len(mylist)):
       sum=0
       for firsts in range(len(mylist)):
           if firsts==seconds:
               pass
           else:
               sum_second=mylist[firsts]*(mylist[seconds]/(1-mylist[firsts]))
               sum+=sum_second
       sec.append(sum)
    print(sec)
    #do something with the list

со следующим примером

alist=[0.4,0.25,0.2,0.15]
Scnd(alist)

результат будет

[0.303921568627451, 0.2732843137254902, 0.23529411764705882, 0.1875]

Я понимаю, что этот код очень медленный, и мне интересно, как сделать его быстрее (возможно, и более аккуратным в процессе).

Источник

Ответы (1)

avatar
trincot
8 августа 2021 в 19:46
0

Я не знаю, намного ли это быстрее, но ваша функция может быть преобразована в это:

def Scnd(mylist=[]):
    sec = [(sum(firsts/(1-firsts) for firsts in mylist) 
            - seconds/(1-seconds)) * seconds
              for seconds in mylist]
    print(sec)
pchatziko
8 августа 2021 в 20:42
0

Определенно аккуратнее, но, к сожалению, не очень быстро. Спасибо хоть