python - 无法复制比较 Python、Numpy 和 Numba 矩阵乘法的结果

标签 python numpy scipy numba

因此,在评估加速 Python 代码的可能性时,我遇到了这篇 Stack Overflow 帖子:Comparing Python, Numpy, Numba and C++ for matrix multiplication

我对 numba 的性能印象深刻,并在 numba 中实现了我们的一些功能。不幸的是,加速仅适用于非常小的矩阵,而对于大矩阵,与之前的 scipy 稀疏实现相比,代码变得非常慢。我认为这是有道理的,但尽管如此,我还是在原始帖子中重复了测试(代码如下)。

当使用 1000 x 1000 矩阵时,根据该帖子,即使 Python 实现也应该花费大约 0.01 秒。这是我的结果:

Python:769.6387 秒
numpy:0.0660 秒
数字:3.0779 秒
scipy:0.0030 秒

我做错了什么才能得到与原始帖子如此不同的结果?我复制了函数并没有改变任何东西。我尝试了Python 3.5.1(64位)和Python 2.7.10(32位),一位同事尝试了相同的代码,得到了相同的结果。这是 100x100 矩阵的结果:

Python:0.6916 秒
numpy:0.0035 秒
numba : 0.0015 秒
scipy:0.0035 秒

我犯了一些明显的错误吗?

import numpy as np
import numba as nb
import scipy.sparse
import time


class benchmark(object):
    def __init__(self, name):
        self.name = name

    def __enter__(self):
        self.start = time.time()

    def __exit__(self, ty, val, tb):
        end = time.time()
        print("%s : %0.4f seconds" % (self.name, end-self.start))
        return False


def dot_py(A, B):
    m, n = A.shape
    p = B.shape[1]

    C = np.zeros((m, p))

    for i in range(0, m):
        for j in range(0, p):
            for k in range(0, n):
                C[i, j] += A[i, k] * B[k, j]
    return C


def dot_np(A, B):
    C = np.dot(A,B)
    return C


def dot_scipy(A, B):
    C = A * B
    return C

dot_nb = nb.jit(nb.float64[:,:](nb.float64[:,:], nb.float64[:,:]), nopython=True)(dot_py)

dim_x = 1000
dim_y = 1000
a = scipy.sparse.rand(dim_x, dim_y, density=0.01)
b = scipy.sparse.rand(dim_x, dim_y, density=0.01)
a_full = a.toarray()
b_full = b.toarray()

print("starting test")

with benchmark("python"):
    dot_py(a_full, b_full)

with benchmark("numpy"):
    dot_np(a_full, b_full)

with benchmark("numba"):
    dot_nb(a_full, b_full)

with benchmark("scipy"):
    dot_scipy(a, b)

print("finishing test")

编辑:

供以后看到此内容的人使用。这是我使用稀疏 nxn 矩阵(1% 的元素非零)时得到的结果。 runtime of nxn matrix multiplication

最佳答案

linked stackoverflow问题是您从哪里获得代码,m = n = 3p 是可变的,而您使用的是 m = n = 1000,这将会在时间上产生巨大的差异。

关于python - 无法复制比较 Python、Numpy 和 Numba 矩阵乘法的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37994521/

相关文章:

python - 使用子进程发送密码

python - 有没有办法获得碰撞点的坐标?

python - np.array(或 vstack)列切片如何工作?

python - AttributeError:模块“scipy”在sklearn/utils/fixes.py中没有属性“sparse”

python - 从数组长度不等的字典中创建数据框

python - 在 Python 中使用 for 循环的 2D 网格

python - NumPy "record array"或 "structured array"或 "recarray"

python - 如何使用 NumPy 正确从 SQL 数据库读取字符串

python - 如何在 python 中访问切片对象的元素

python - 属性错误 : module 'scipy.misc' has no attribute 'toimage'