2017-01-01 3 views
1

Я хотел бы знать, как сделать следующий код короче и/или более эффективным. Мог ли я (или я должен) избавиться от цикла for, используя функциональный метод, или есть метод, который я должен использовать из numpy?Как оптимизировать генерацию данных для вызова numpy

Код вычисляет ожидаемое значение массива из целых чисел.

vals = np.arange(self.n+1) 

# array of probability of each value in vals 
parr = np.ones(len(vals)) 
for i in range(len(vals)): 
    parr[i] *= self.prob(vals[i]) 

return np.dot(vals,parr) 

В соответствии с просьбой в комментариях, реализация метода Prob():

def prob(self, x): 

    """Computes probability of removing x items 

    :param x: number of items to remove 
    :returns: probability of removing x items 
    """ 

    # p is the probability of removing an item 
    # sl.choose computes n choose x 
    return sl.choose(self.n, x) * (self.p**x) * \ 
      (1-self.p)**(self.n-x) 
+4

Вы должны попробовать код Обзор –

+0

@PythonMaster Хорошо спасибо! – Connor

+3

Что такое 'prob()'? – Divakar

ответ

2

Петля может быть сведено к списку понимания:

vals = np.arange(self.n+1) 

# array of probability of each value in vals 
parr = [self.prob(v) for v in vals] 

return np.dot(vals, parr) 
+0

Ницца! Спасибо. – Connor

+1

понимание списка –

3

Я думаю, что это будет наиболее быстро:

vals = np.arange(self.n+1) 

# array of probability of each value in vals 
parr = self.prob(vals)  

return np.dot(vals,parr) 

и развлечения фикция:

def prob(list_of_x): 

    """Computes probability of removing x items 

    :param list_of_x: numbers of items to remove 
    :returns: probability of removing x items 
    """ 

    # p is the probability of removing an item 
    # sl.choose computes n choose x 
    return np.asarray([sl.choose(self.n, e) for e in list_of_x]) * (self.p ** list_of_x) * \ 
      (1-self.p)**(self.n - list_of_x) 

Поскольку NumPy быстрее:

import timeit 

import numpy as np 

list_a = [1, 2, 3] * 1000 
list_b = [4, 5, 6] * 1000 

np_list_a = np.asarray(list_a) 
np_list_b = np.asarray(list_b) 

print(timeit.timeit('[a * b for a, b in zip(list_a, list_b)]', 'from __main__ import list_a, list_b', number=1000)) 
print(timeit.timeit('np_list_a * np_list_b', 'from __main__ import np_list_a, np_list_b', number=1000)) 

Результат:

0.19378583212707723 
0.004333830584755033 
Смежные вопросы