我知道这种方式没有抓住问题的重点,但是由于您用标签标记了问题numpy
并正在查看大型阵列的速度差异,我想我会提到有更快的解决方案完全是另一回事。
所以,你正在做的是一个点积,所以 use numpy.dot
,它是用外部库(LAPACK?)的乘法和求和构建的(为了方便起见,我将使用 的语法test1
,尽管@Tim's answer,因为不需要传递额外的参数。)
def test3(self):
return np.dot(self.x, self.x)
甚至可能更快(当然更通用):
def test4(self):
return np.einsum('i,i->', self.x, self.x)
以下是一些测试:
In [363]: paste
class Tester():
def __init__(self, n):
self.x = np.arange(n)
def test1(self):
return np.sum(self.x * self.x)
def test2(self, x):
return np.sum(x*x)
def test3(self):
return np.dot(self.x, self.x)
def test4(self):
return np.einsum('i,i->', self.x, self.x)
## -- End pasted text --
In [364]: t = Tester(10000)
In [365]: np.allclose(t.test1(), [t.test2(t.x), t.test3(), t.test4()])
Out[365]: True
In [366]: timeit t.test1()
10000 loops, best of 3: 37.4 µs per loop
In [367]: timeit t.test2(t.x)
10000 loops, best of 3: 37.4 µs per loop
In [368]: timeit t.test3()
100000 loops, best of 3: 15.2 µs per loop
In [369]: timeit t.test4()
100000 loops, best of 3: 16.5 µs per loop
In [370]: t = Tester(10)
In [371]: timeit t.test1()
100000 loops, best of 3: 16.6 µs per loop
In [372]: timeit t.test2(t.x)
100000 loops, best of 3: 16.5 µs per loop
In [373]: timeit t.test3()
100000 loops, best of 3: 3.14 µs per loop
In [374]: timeit t.test4()
100000 loops, best of 3: 6.26 µs per loop
谈到小的,几乎是语法上的速度差异,考虑使用一种方法而不是独立函数:
def test1b(self):
return (self.x*self.x).sum()
给出:
In [385]: t = Tester(10000)
In [386]: timeit t.test1()
10000 loops, best of 3: 40.6 µs per loop
In [387]: timeit t.test1b()
10000 loops, best of 3: 37.3 µs per loop
In [388]: t = Tester(3)
In [389]: timeit t.test1()
100000 loops, best of 3: 16.6 µs per loop
In [390]: timeit t.test1b()
100000 loops, best of 3: 14.2 µs per loop