Python 如何优化numpy调用的数据生成

Python 如何优化numpy调用的数据生成,python,performance,numpy,functional-programming,Python,Performance,Numpy,Functional Programming,我想知道如何使下面的代码更短和/或更高效。我是否可以或者应该使用函数方法来摆脱for循环,或者是否应该使用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

我想知道如何使下面的代码更短和/或更高效。我是否可以或者应该使用函数方法来摆脱for循环,或者是否应该使用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)
根据评论中的要求,方法的实施可能:

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)

循环可以简化为一个列表:

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)

循环可以简化为一个列表:

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)

我认为这将是最快的:

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

我认为这将是最快的:

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

你应该试试代码Review@PythonMaster好的,谢谢!prob到底是什么?如果从某个模块导入,您能否共享它的实现或导入命令?该代码到底在做什么?你基本上是把每一个parr[i]设为probvals[i],对吗?因为你总是乘以1,1*vals[i]总是等于vals[i]。但是,为什么要乘法呢?你应该试试代码Review@PythonMaster好的,谢谢!prob到底是什么?如果从某个模块导入,您能否共享它的实现或导入命令?该代码到底在做什么?你基本上是把每一个parr[i]设为probvals[i],对吗?因为你总是乘以1,1*vals[i]总是等于vals[i]。但是,为什么要成倍增长呢?很好!谢谢你,很好!谢谢你,我明白了