python中多个列表的产品总数

2024-05-13 07:12:23 发布

您现在位置:Python中文网/ 问答频道 /正文

试图模仿Excel的SUMPRODUCT函数:

SUMPRODUCT(v1, v2, ..., vN) =
    v1[0]*v2[0]*...*vN[0] + v1[1]*v2[1]*...*vN[1] + ... + v1[n]*v2[n]*...*vN[n]

其中n是每个向量中的元素数。

这类似于点积,但对于多个向量。我读过正规点积的the very detailed discussion,但我不知道如何将它干净地扩展到多个向量。作为参考,我复制了这里提出的优化代码,并将其移植到了Python 3中。顺便说一下,对于点积,最后一种方法仍然在P3K中获胜

def d0(v1,v2):
    """                                                                                                     
    d0 is Nominal approach:                                                                                 
    multiply/add in a loop                                                                                  
    """
    out = 0
    for k in range(len(v1)):
        out += v1[k] * v2[k]
    return out

def d1(v1,v2):
    """                                                                                                     
    d1 uses a map                                                                        
    """
    return sum(map(mul,v1,v2))

def d3(v1,v2):
    """                                                                                                     
    d3 uses a starmap (itertools) to apply the mul operator on an zipped (v1,v2)                           
    """
    return sum(starmap(mul,zip(v1,v2)))

Tags: theinmapreturndefout向量v2
3条回答

映射列表以创建产品列表,然后对其求和。

这可以在一行中完成:

sum(map(lambda Xi, Yi: Xi * Yi, ListX, ListY))

好的旧清单理解呢?(正如@Turksarama提到的,这只适用于两个列表)

sum([x * y for x, y in zip(*lists)])

在Python3.6中测试:

In [532]: import random

In [534]: x = [random.randint(0,100) for _ in range(100)]

In [535]: y = [random.randint(0,100) for _ in range(100)]

In [536]: lists = x, y

使用列表理解

In [543]: %timeit(sum([x * y for x, y in zip(*lists)]))
8.73 µs ± 24.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

注意“tuple”理解是slower

In [537]: %timeit(sum(x * y for x, y in zip(*lists)))
10.5 µs ± 170 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

使用map

In [539]: %timeit(sum(map(lambda xi, yi: xi * yi, x, y)))
12.3 µs ± 144 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

使用functools.reduce

In [542]: %timeit(sum(functools.reduce(operator.mul, data) for data in zip(*lists)))
38.6 µs ± 330 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
import operator

def sumproduct(*lists):
    return sum(reduce(operator.mul, data) for data in zip(*lists))

对于python 3

import operator
import functools

def sumproduct(*lists):
    return sum(functools.reduce(operator.mul, data) for data in zip(*lists))

相关问题 更多 >