2017-01-01 7 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

大丈夫ありがとう@PythonMasterコードレビュー –

+0

を試してみてください! – 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) 

と楽しいction:

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 
関連する問題