我正在尝试用 Python 进行一些 3d 渲染。我一直在读 Python 太慢了!我只是必须利用 Numpy 的 C-awesomeness 来处理我在着色器中无法完成的所有矩阵内容!否则什么都行不通,yadda,yadda(在这里转述..)。
但是:我做了一些测试!
这是一个随机矩阵,一次是 Numpy 风格的:
matrix1 = numpy.matrix([[1, 1, 0, 0,], [0, 1, 0, 0], [0, 0, 1, 1], [0, 0, 0, 1]])
>>> matrix([[1, 1, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 1],
[0, 0, 0, 1]])
并且曾经作为一个沼泽标准元组:
matrix2 = (1, 1, 0, 0,\
0, 1, 0, 0,\
0, 0, 1, 1,\
0, 0, 0, 1)
现在,如果我想要反过来,我可以在 Numpy 中做到这一点:
def inv_1():
return matrix1.I
或者作为纯 Python (我省略了一些数学,因为它伤害了我的头):
def inv_2():
m0, m1, m2, m3, \
m4, m5, m6, m7, \
m8, m9, m10, m11, \
m12, m13, m14, m15 = matrix2
A0 = (( m0 * m5) - ( m1 * m4)) ....
...B5 = ((m10 * m15) - (m11 * m14))
det = 1.0 / det
return (
(+ ( m5 * B5) - ( m6 * B4) + ( m7 * B3)) * det, ...
...(+ ( m8 * A3) - ( m9 * A1) + (m10 * A0)) * det
)
两者都工作正常:
inv_1()
>>>> matrix([[ 1., -1., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., -1.],
[ 0., 0., 0., 1.]])
inv_2()
>>>> (1.0, -1.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, -1.0,
0.0, 0.0, 0.0, 1.0) (I added the line-breaks here for clarity)
但纯 Python 代码的运行速度始终比备受赞誉的 Numpy 快十倍:
timeit.timeit(inv_1, number=100000)
>>>> 3.0659120082855225
timeit.timeit(inv_2, number=100000)
>>>> 0.4014430046081543
如果你加上将我漂亮的元组矩阵转换为 Numpy 矩阵的开销,它会更慢。
那么这里发生了什么?难道我做错了什么?这完全是由于调用 C 函数的开销造成的吗?我偷的反码代码是不是违反了物理定律?
谢谢你帮我解禁!爱你们!