为什么np.dot比使用for-loops查找点积快得多

时间:2017-02-14 13:29:16

标签: python numpy

这是使用np.dot的时间:

import numpy as np
import timeit

x = np.random.random(size=10**7)
a = np.ones(x.size)

%time np.dot(x, a)
  

壁垒时间:11毫秒

     

5001679.267011214

以下是使用for循环的时间:

import numpy as np
import timeit

x = np.random.random(size=10**7)
a = np.ones(x.size)

def innfeldi(vigur1, vigur2):
    return sum([vigu1[i]*vigur2[i] for i in range(len(vigur1))])

%timeit innfeldi(x, a)
  

壁垒时间:4.78秒

     

4998161.0032265792

2 个答案:

答案 0 :(得分:2)

因为np.dot在编译代码中执行实际算术运算和封闭循环,这比Python解释器快得多。

这个原则,将重复的事物组合在一起并尽可能地删除解释器,这就是为什么我们可以用高级语言编写数字代码,例如以可接受的速度运行的Python或matlab。

答案 1 :(得分:0)

numpy中的许多函数都是用优化的C代码编写的。但是,您正在测试的不是一个公平的比较。

通过迭代numpy数组,你要求python访问底层C数组中的单个元素,将它从C中拉出并进入python,从而创建一个python对象来进行操作。这样做有很多开销。

Python永远不会像C一样快,但更公平的比较是使用numpy的内置数组模块,以及优化的函数

import numpy as np
import array
import random
from operator import mul

x = np.random.random(size=10**7)
y = array.array('f', (random.random() for x in range(10**7)))

a = np.ones(x.shape)
b = array.array('d', [1]*10**7)

%%timeit -n3 -r1
np.dot(x,a)
# 3 loops, best of 1: 17.1 ms per loop

%%timeit -n3 -r1
sum(map(mul, y,b))
# 3 loops, best of 1: 777 ms per loop