python - 当矩阵中的行多 10 倍时,为什么 np.dot 不会(至少)长 10 倍

标签 python numpy matrix optimization

我正在尝试使用 PyCUDA 并行化一些矩阵运算,并将其与 python 进行比较。

但是我有一个结果我真的不明白。当我将矩阵 A 的行数乘以矩阵乘积 A*B 的行数时,大多数情况下计算时间不会乘以 10。

拿这段代码:

import time
import numpy as np

nb_traces=pow(10,1) # Nb lines
nb_samples=100 # Nb columns

a_cpu=np.ones((nb_traces,nb_samples)).astype(np.float32)
b_cpu=np.ones((nb_samples,2)).astype(np.float32)

t1PythonBegin=time.clock()
c_cpu=np.dot(a_cpu,b_cpu)
t1PythonEnd=time.clock()

print(t1PythonEnd-t1PythonBegin)
print(c_cpu.shape)
print(" ")
nb_traces=pow(10,2) # Nb lines of A : 10 times bigger than before
nb_samples=100 # Nb colonnes

a_cpu=np.ones((nb_traces,nb_samples)).astype(np.float32)
b_cpu=np.ones((nb_samples,2)).astype(np.float32)

t1PythonBegin=time.clock()
c_cpu=np.dot(a_cpu,b_cpu)
t1PythonEnd=time.clock()

print(t1PythonEnd-t1PythonBegin)
print(c_cpu.shape)

当我运行它时,我对这两个计算有相同的数量级。

例如,这是我的输出:

第一行是我在A中有10^1行时的计算时间,第二行是我有10^2行时的计算时间(我在时间计算下也显示了A的形状)。

模拟 1:

3.120985184068559e-05
(10, 2)

9.086412319447845e-06
(100, 2)

模拟 2:

3.358022058819188e-05
(10, 2)

3.0024667466932442e-05
(100, 2)

模拟 3:

1.6987641174637247e-05
(10, 2)

1.7777763787307777e-05
(100, 2)

有时,对于多 10 倍的行,计算时间甚至更快!

你怎么解释这个?我真的不明白...事实上,如果矩阵 A 中的行多 10 倍,我要计算的系数就会多 10 倍。所以程序应该长 10 倍(因为没有并行化)。

最佳答案

这有多种原因。首先,作为Swier已经指出,函数的开销(Python 在实际调用函数之前所做的事情)比函数本身花费更多的时间。

然而,对于大输入,还有第二个更重要的问题:Numpy 使用一种叫做 BLAS 的东西。做矩阵运算。如果您的 BLAS 是这样配置的(特别是如果您使用的是 Anaconda,它会自动为您执行此操作),它为您并行化代码,即使您不自己做也是如此。

关于python - 当矩阵中的行多 10 倍时,为什么 np.dot 不会(至少)长 10 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47834603/

相关文章:

python - Django 应用程序的 Procfile 中应该包含哪些内容?

python - python 3.6.4 中的错误 Opencv 3

python - 对如何切片 numpy 数组感到困惑

python - 计算矩阵的每个元素

c++ - 计算矩阵的 n 次方

python - 导入错误:使用 Mingus 库时没有名为 'mt_exceptions' 的模块

python - 无法使py2exe工作

python - python 正数的对数结果为负无穷大

python - 生成具有不同参数的python函数

arrays - 在 Matlab 中向量化和分离查找操作