在numpy-python中加速莫来石运算符的叉积和点积



我的代码中有一个循环。我试着把所有向量都改成一个例子,使它变得简单,如下面的例子所示。我必须在这个循环中试试,在另一个循环中230000。本部分约26.36。有没有任何方法可以加快或调整速度以获得最佳速度。

trr=time.time()
for i in range (230000):
print(+1 *0.0001 * 1 * 1000 * (
1 * np.dot(np.subtract([2,1], [4,3]), [1,2]) + 1
* np.dot(
np.cross(np.array([0, 0, 0.5]),
np.array([1,2,3])),
np.array([1,0,0]))
- 1 * np.dot((np.cross(
np.array([0,0,-0.5]),
np.array([2,4,1]))), np.array(
[0,1,0])))    )
print(time.time()-trr)

带有变量的代码:

For i in range (23000):
.......
.....


else:

delta_fs = +1 * dt * 1 * ks_smoot * A_2d * (
np.dot(np.subtract(grains[p].v, grains[w].v), vti) * sign +
np.dot(np.cross(np.array([0, 0, grains[p].rotational_speed]),
np.array(np.array(xj_c) - np.array(xj_p))),
np.array([vti[0], vti[1], 0])) * sign
- np.dot((np.cross( np.array([0, 0, grains[w].rotational_speed]),
np.array(np.array(xj_c) - np.array(xj_w)))), np.array(
[vti[0], vti[1], 0])) * sign)

如果将示例保存在变量中会更好,因为代码很难阅读。忽略您的示例中的循环只是一遍又一遍地计算相同的常数值这一事实,我的工作假设是您需要在各种numpy数组/向量上多次运行一组特定的numpy操作。您可能会发现花一些时间查看numba的文档很有用。这里有一个非常基本的例子:

import numpy as np
import numba as nb
CONST = 1*0.0001*1*1000
a0 = np.array([2.,1.])
a1 = np.array([4.,3.])
a2 = np.array([1.,2.])
b0 = np.array([0., 0., 0.5])
b1 = np.array([1.,2.,3.])
b2 = np.array([1.,0.,0.])
c0 = np.array([0.,0.,-0.5])
c1 = np.array([2.,4.,1.])
c2 = np.array([0.,1.,0.])
@nb.jit()
def op1(iters):
for i in range(iters):
op = CONST * (1 * np.dot(a0-a1,a2)
+ 1 * np.dot(np.cross(b0,b1),b2)
- 1 * np.dot(np.cross(c0,c1),c2))
op1(1) # Initial compilation
def op2(iters):
for i in range(iters):
op = CONST * (1 * np.dot(a0-a1,a2)
+ 1 * np.dot(np.cross(b0,b1),b2)
- 1 * np.dot(np.cross(c0,c1),c2))
%timeit -n 100 op1(100)
# 54 µs ± 2.49 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit -n 100 op2(100)
# 15.5 ms ± 313 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

看起来它会快几个数量级,这应该很容易将你的时间减少到几分之一秒。

相关内容

  • 没有找到相关文章

最新更新