优化列表上的简单数学计算

Wea*_*ped 0 python optimization

我有一个我正在计算的脚本:

def sumsquared(arr):
    sum = 0
    idx = 0
    len = arr.__len__()
    while idx < (len - 1):
            sum = sum + (arr[idx] * arr[idx]) + (arr[idx+1] * arr[idx+1])
            idx = idx + 2

    return sum
Run Code Online (Sandbox Code Playgroud)

上面的函数在循环中调用,循环填充两个列表并调用此函数两次:第一次使用len~1024项目列表,第二次使用len~44100项目.根据输入,循环本身可以运行100到100000次.

对于小尺寸输入,cProfile基于概要分析通知我:

ncalls  tottime  percall  cumtime  percall  filename:lineno(function)
---------------------------------------------------------------------
 2560   12.065   0.005    12.065    0.005    beat.py:8(sumsquared)
Run Code Online (Sandbox Code Playgroud)

这大约是脚本总运行时间的95%.有什么方法可以加快功能吗?

Bre*_*arn 5

你的功能很奇怪.它所做的只是计算元素的平方和,除非如果有奇数个元素,它会丢弃最后一个元素.由于某种原因,您一次添加两个,但这不会影响最终结果.

为了加快速度,您可以使用numpy而不是编写自己的函数.

>>> x = np.array([1, 2, 3, 4, 5])
>>> sumsquared(x)
30
>>> (x[:2*(len(x)//2)]**2).sum()
30
Run Code Online (Sandbox Code Playgroud)

通常,如果您有数千个数字的列表,则使用numpy数组可能会带来重大的性能提升.