Найти - Пользователи
Полная версия: Как короче и быстрее пройтись по спискам
Начало » Python для новичков » Как короче и быстрее пройтись по спискам
1
itsLek
День добрый.

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

Есть 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))

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

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

Заранее Спасибо!
PooH
 score = sum(y >= 0.6 and x or 0 for x, y in zip(y_true, y_probs))
itsLek
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 обработки в одну?
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
itsLek
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

А через генератор списков еще быстрее не будет?
vic57
itsLek
А через генератор списков еще быстрее не будет?
замерьте, но имхо генератор - обертка для цикла
PooH
 sum(y >= 0.6 and (x or -1) or 0 for x, y in zip(y_true, y_probs))
vic57
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
Vladimirv
 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
Время вряд лм уменьшится.
py.user.next
  
>>> 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
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB