首页 > 解决方案 > 使用 NumPy 更优化的数学函数

问题描述

对于我的课程,我需要使用 NumPy 编写更优化的数学函数。问题是,当使用 NumPy 时,我的解决方案在使用原生 Python 时速度较慢。

  1. 将数组的所有元素立方并求和的函数

Python:

def cube(x):
    result = 0
    for i in range(len(x)):
        result += x[i] ** 3
    return result

我的,使用 NumPy(慢 15-30%):

def cube(x):
    it = numpy.nditer([x, None])
    for a, b in it:
        b[...] = a*a*a
    return numpy.sum(it.operands[1])
  1. 一些随机计算函数

Python:

def calc(x):
    m = sum(x) / len(x)
    result = 0

    for i in range(len(x)):
        result += (x[i] - m)**4

    return result / len(x)

NumPy(慢 10 倍以上):

def calc(x):
    m = numpy.mean(x)
    result = 0
    for i in range(len(x)):
        result += numpy.power((x[i] - m), 4)
    return result / len(x)

我不知道如何解决这个问题,到目前为止我已经尝试过 NumPy 的随机函数

标签: pythonperformancenumpy

解决方案


详细说明评论中所说的内容:

Numpy 的强大之处在于能够在快速 c/fortran 中完成所有循环,而不是慢速 Python 循环。例如,如果您有一个数组x,并且想要计算该数组中每个值的平方,您可以这样做

y = []
for value in x:
    y.append(value**2)

甚至(通过列表理解)

y = [value**2 for value in x]

但是如果你可以在 numpy 中执行所有循环,它会快得多

y = x**2

(假设x已经是一个 numpy 数组)。

因此,对于您的示例,在 numpy 中执行此操作的正确方法是

1.

def sum_of_cubes(x):
    result = 0
    for i in range(len(x)):
        result += x[i] ** 3
    return result

def sum_of_cubes_numpy(x):
    return (x**3).sum()
def calc(x):
    m = sum(x) / len(x)
    result = 0

    for i in range(len(x)):
        result += (x[i] - m)**4

    return result / len(x)

def calc_numpy(x):
    m = numpy.mean(x)  # or just x.mean()
    return numpy.sum((x - m)**4) / len(x)

请注意,我假设输入x已经是一个 numpy 数组,而不是一个常规的 Python 列表:如果你有一个 list lst,你可以用它创建一个数组arr = numpy.array(lst)


推荐阅读