Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 28, 2017 11:36:41

itsLek
Зарегистрирован: 2016-11-10
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как короче и быстрее пройтись по спискам

День добрый.

Вопрос по оптимизации кода, чтоб сделать его быстрее.

Есть 2 списка одинаковой длинны:

y=[0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1]
x = [0, 0, 0.7, 0.5, 0.6, 0.7, 0, 0, 0, 0.8, 0.75, 0.6]

Нужно - где y_probs >= 0.6 посмотреть значение y_true. Если у него 1, то записываем win+=1, else loss+=1
А в конце считаем scoreee=win-loss

У меня получилась достаточно громоздкая функция

 def cscoree(y_true, y_probs):
    win=0
    loss=0
    scoreee=0
    i=0
    while i < len(y_true):
        if y_probs[i] >= uver:
            if y_true[i] > 0:
                win+=1
            else:
                loss+=1
        i+=1
    scoreee=win-loss
    return scoreee

Попытался это сделать через map c lambda, но получилось как-то криво)
 new_list = list(map(lambda x,y: (y if (x >= 0.6) else 2), x, y))
scoreee = (new_list.count(1) - new_list.count(0))

Может через генераторы списков?

Вообще, как можно реализовать данный подсчет эффективней всего по скорости вычисления?

Заранее Спасибо!

Отредактировано itsLek (Апрель 28, 2017 13:02:24)

Офлайн

#2 Апрель 28, 2017 12:26:02

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Как короче и быстрее пройтись по спискам

 score = sum(y >= 0.6 and x or 0 for x, y in zip(y_true, y_probs))



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Апрель 28, 2017 12:59:47

itsLek
Зарегистрирован: 2016-11-10
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как короче и быстрее пройтись по спискам

PooH
 score = sum(y >= 0.6 and x or 0 for x, y in zip(y_true, y_probs))
Спасибо за отклик, но так мы подсчитаем только win
чтоб получить полноценный score нам нужно знать и loss (т.е. те моменты когда x >= 0.6 но y = 0)

В этом у меня и загвоздка, как засунуть 2 обработки в одну?

Отредактировано itsLek (Апрель 28, 2017 13:03:09)

Офлайн

#4 Апрель 28, 2017 14:33:47

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Как короче и быстрее пройтись по спискам

 win = 0
loss = 0
for x,y in zip(x,y):
    if x >= 0.6:
        if y: win += 1
        else: loss += 1
print win,loss,win - loss

Отредактировано vic57 (Апрель 28, 2017 14:34:56)

Офлайн

#5 Апрель 28, 2017 15:46:16

itsLek
Зарегистрирован: 2016-11-10
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как короче и быстрее пройтись по спискам

vic57
 win = 0
loss = 0
for x,y in zip(x,y):
    if x >= 0.6:
        if y: win += 1
        else: loss += 1
print win,loss,win - loss
Спасибо, это решение действительно быстрее.

Было Wall time: 766 ms
Стало Wall time: 422 ms

А через генератор списков еще быстрее не будет?

Отредактировано itsLek (Апрель 28, 2017 15:51:58)

Офлайн

#6 Апрель 28, 2017 16:57:43

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Как короче и быстрее пройтись по спискам

itsLek
А через генератор списков еще быстрее не будет?
замерьте, но имхо генератор - обертка для цикла

Офлайн

#7 Апрель 28, 2017 17:59:37

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Как короче и быстрее пройтись по спискам

 sum(y >= 0.6 and (x or -1) or 0 for x, y in zip(y_true, y_probs))



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#8 Апрель 28, 2017 18:45:36

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Как короче и быстрее пройтись по спискам

itsLek
Было Wall time: 766 ms
Стало Wall time: 422 ms
странно вы время меряете
  
from time import time
y=[0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1]
x = [0, 0, 0.7, 0.5, 0.6, 0.7, 0, 0, 0, 0.8, 0.75, 0.6]
t1 = time()
score = 0
for x,y in zip(x,y):
    if x >= 0.6:
        if y: score += 1
        else: score -= 1
t = time() - t1
print "time: %f" % t
print 'score:',score

Офлайн

#9 Апрель 28, 2017 19:05:25

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

Как короче и быстрее пройтись по спискам

 y=[0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1]
x = [0, 0, 0.7, 0.5, 0.6, 0.7, 0, 0, 0, 0.8, 0.75, 0.6]
win,loss = sum([1 for a,b in zip(x,y) if a>=0.6 and b]) , sum([1 for a,b in zip(x,y) if a>=0.6 and not b])
print win,loss,win - loss
Время вряд лм уменьшится.

Отредактировано Vladimirv (Апрель 28, 2017 19:06:49)

Офлайн

#10 Апрель 30, 2017 07:28:42

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Как короче и быстрее пройтись по спискам

  
>>> x = [0, 0, 0.7, 0.5, 0.6, 0.7, 0, 0, 0, 0.8, 0.75, 0.6]
>>> y = [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1]
>>> 
>>> score = sum(i[1] and 1 or -1 for i in
...             (i for i in zip(x, y) if i[0] >= 0.6))
>>> score
4
>>>



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version