Python中向量矩阵乘积的时间复杂度有什么问题?

Python中向量矩阵乘积的时间复杂度有什么问题?,python,performance,time-complexity,Python,Performance,Time Complexity,我有以下代码对随机向量(dimensionconst)和随机矩阵(dimensionconstxn)进行采样,所有条目都有const/n位 为了避免舍入错误,n始终是const的除数,因此,const/n始终是整数 因此,函数mult_vec_mat(u,A)总是执行const*const*n常量/n位整数的乘积。假设Python需要时间b*log(b)乘以两个b-位整数,该函数的时间复杂度应该是 const*const*n*log(const/n)*const/n=const³*(log(co

我有以下代码对随机向量(dimension
const
)和随机矩阵(dimension
const
x
n
)进行采样,所有条目都有
const/n

为了避免舍入错误,
n
始终是
const
的除数,因此,
const/n
始终是整数

因此,函数
mult_vec_mat(u,A)
总是执行
const*const*n
常量/n位整数的乘积。假设Python需要时间
b*log(b)
乘以两个
b
-位整数,该函数的时间复杂度应该是

const*const*n*log(const/n)*const/n=const³*(log(const)-log(n))

因此,当
n
增大时,它应该减小

即使我们假设Python使用
b*b
乘以
b
-位整数,复杂性仍然是
n
中的一个递减函数

但是,从下面的输出可以看出,
mult_vec_mat(u,A)
的运行时间减少,直到
n
的某个值,然后开始增加

你对此有什么解释吗?为什么
mult\u vec\u mat(u,A)
的运行时间不符合我估计的时间复杂度

代码 输出
from random import randint
from time import time

def random_vec(n, bound=2):
    return [randint(0, bound) for _ in xrange(n)]

def random_matrix(nrows, ncols, bound=2):
    A = [0 for _ in xrange(nrows)]
    for i in xrange(nrows):
        A[i] = random_vec(ncols, bound)
    return A

def mult_vec_mat(u, A):
    nrows = len(A)
    ncols = len(A[0])
#    v = [0 for _ in xrange(ncols)]
    for j in xrange(ncols):
        tmp = 0
        for i in xrange(nrows):
            tmp += u[i] * A[i][j]
#        v[j] = tmp
#    return v

def benchmark_prod():

    NUMBER_TESTS = 3
    const = 5040

    for n in [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 28, 30, 35, 36, 40, 42, 45, 48, 56, 60, 63, 70, 72]:
        bitlen = const / n # always an integer

        avg_time = 0
        for k in xrange(NUMBER_TESTS):
            c = random_vec(const, 2**bitlen)
            C = random_matrix(const, n, 2**bitlen)

            start = time()
            mult_vec_mat(c, C)
            end = time()
            avg_time += (end - start)

        print "n =", n
        print "bitlen =", bitlen
        print "n * bitlen =", n*bitlen
        print "const =", const
        print "const * n * bitlen =", const * n * bitlen
        print "         time: ", (avg_time / NUMBER_TESTS), "seconds"
        print "..................................................................."


benchmark_prod()
n = 2
bitlen = 2520
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0886503060659 seconds
...................................................................
n = 3
bitlen = 1680
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0701853434245 seconds
...................................................................
n = 4
bitlen = 1260
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0559728940328 seconds
...................................................................
n = 5
bitlen = 1008
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0478646755219 seconds
...................................................................
n = 6
bitlen = 840
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0430323282878 seconds
...................................................................
n = 7
bitlen = 720
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.041002591451 seconds
...................................................................
n = 8
bitlen = 630
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0406827411652 seconds
...................................................................
n = 9
bitlen = 560
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.039892355601 seconds
...................................................................
n = 10
bitlen = 504
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0358901023865 seconds
...................................................................
n = 12
bitlen = 420
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0406420230865 seconds
...................................................................
n = 14
bitlen = 360
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0487660566966 seconds
...................................................................
n = 15
bitlen = 336
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0454970200857 seconds
...................................................................
n = 16
bitlen = 315
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0551973978678 seconds
...................................................................
n = 18
bitlen = 280
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0513706207275 seconds
...................................................................
n = 20
bitlen = 252
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0515103340149 seconds
...................................................................
n = 21
bitlen = 240
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0477599302928 seconds
...................................................................
n = 24
bitlen = 210
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0475799242655 seconds
...................................................................
n = 28
bitlen = 180
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0549654165904 seconds
...................................................................
n = 30
bitlen = 168
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0527282555898 seconds
...................................................................
n = 35
bitlen = 144
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0609803994497 seconds
...................................................................
n = 36
bitlen = 140
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0620452562968 seconds
...................................................................
n = 40
bitlen = 126
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0735117594401 seconds
...................................................................
n = 42
bitlen = 120
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.078006029129 seconds
...................................................................
n = 45
bitlen = 112
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0749526818593 seconds
...................................................................
n = 48
bitlen = 105
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0841933091482 seconds
...................................................................
n = 56
bitlen = 90
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0847909450531 seconds
...................................................................
n = 60
bitlen = 84
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.0929036140442 seconds
...................................................................
n = 63
bitlen = 80
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.111557722092 seconds
...................................................................
n = 70
bitlen = 72
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.109657287598 seconds
...................................................................
n = 72
bitlen = 70
n * bitlen = 5040
const = 5040
const * n * bitlen = 25401600
         time:  0.118753115336 seconds
...................................................................