繁体   English   中英

加速 numpy python 中的莫来石算子叉积和点积

[英]Speed up the mullite operator cross product and dot product in 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)

似乎它会快多个数量级,这应该很容易将您的时间缩短到几分之一秒。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM