计算速度慢:itertools.product可能是罪魁祸首吗?

埃里克·肯特利

数值积分所花费的时间比我预期的长。我想知道我在网格上实现迭代的方式是否可能是一个促成因素。我的代码如下所示:

import numpy as np
import itertools as it

U = np.linspace(0, 2*np.pi)
V = np.linspace(0, np.pi)

for (u, v) in it.product(U,V):
    # values = computation on each grid point, does not call any outside functions
    # solution = sum(values)
return solution

我省略了计算,因为它们很长,我的问题特别是关于我在参数空间(u,v)上实现计算的方式。我知道诸如以下的替代方法numpy.meshgrid但是,所有这些似乎都创建了(非常大)矩阵的实例,我猜想将它们存储在内存中会使速度变慢。

有没有其他选择it.product可以加快我的程序的速度,还是我应该在其他地方寻找瓶颈?

编辑:这是有问题的for循环(以查看是否可以向量化)。

import random  
import numpy as np  
import itertools as it 

##########################################################################
# Initialize the inputs with random (to save space)
##########################################################################
mat1 = np.array([[random.random() for i in range(3)] for i in range(3)])
mat2 = np.array([[random.random() for i in range(3)] for i in range(3)]) 
a1, a2, a3 = np.array([random.random() for i in range(3)]) 
plane_normal = np.array([random.random() for i in range(3)])  
plane_point = np.array([random.random() for i in range(3)])  
d = np.dot(plane_normal, plane_point)  
truthval = True

##########################################################################
# Initialize the loop
##########################################################################
N = 100 
U = np.linspace(0, 2*np.pi, N + 1, endpoint = False) 
V = np.linspace(0, np.pi, N + 1, endpoint = False) 
U = U[1:N+1] V = V[1:N+1]

Vsum = 0
Usum = 0

##########################################################################
# The for loops starts here
##########################################################################   
for (u, v) in it.product(U,V):

    cart_point = np.array([a1*np.cos(u)*np.sin(v), 
                           a2*np.sin(u)*np.sin(v), 
                           a3*np.cos(v)])

    surf_normal = np.array(
            [2*x / a**2 for (x, a) in zip(cart_point, [a1,a2,a3])])


    differential_area = \
        np.sqrt((a1*a2*np.cos(v)*np.sin(v))**2 + \
        a3**2*np.sin(v)**4 * \
        ((a2*np.cos(u))**2 + (a1*np.sin(u))**2)) * \
        (np.pi**2 / (2*N**2)) 


    if (np.dot(plane_normal, cart_point) - d > 0) == truthval:
        perp_normal = plane_normal
        f = np.dot(np.dot(mat2, surf_normal), perp_normal)
        Vsum += f*differential_area
    else:
        perp_normal = - plane_normal
        f = np.dot(np.dot(mat2, surf_normal), perp_normal)
        Usum += f*differential_area

integral = abs(Vsum) + abs(Usum)
hpaulj

如果U.shape == (nu,)(V.shape == (nv,),则以下数组会将大多数计算向量化。使用numpy时,通过将数组用于最大尺寸并在较小的尺寸(例如3x3)上循环,可以达到最佳速度。

更正版本

A = np.cos(U)[:,None]*np.sin(V)
B = np.sin(U)[:,None]*np.sin(V)
C = np.repeat(np.cos(V)[None,:],U.size,0)
CP = np.dstack([a1*A, a2*B, a3*C])

SN = np.dstack([2*A/a1, 2*B/a2, 2*C/a3])

DA1 = (a1*a2*np.cos(V)*np.sin(V))**2
DA2 = a3*a3*np.sin(V)**4
DA3 = (a2*np.cos(U))**2 + (a1*np.sin(U))**2
DA = DA1 + DA2 * DA3[:,None]
DA = np.sqrt(DA)*(np.pi**2 / (2*Nu*Nv))

D = np.dot(CP, plane_normal)
S = np.sign(D-d)

F1 = np.dot(np.dot(SN, mat2.T), plane_normal)
F = F1 * DA
#F = F * S # apply sign
Vsum = F[S>0].sum()
Usum = F[S<=0].sum()

使用相同的随机值,将产生相同的值。在100x100的情况下,速度要快10倍。一年后与这些矩阵一起玩很有趣。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

寻找罪魁祸首

来自分类Dev

Excel中假定为空单元格中的幻影数据(可能是罪魁祸首)

来自分类Dev

Haskell计算Ackermann 4 1的速度慢吗?

来自分类Dev

如何知道try块中的罪魁祸首?

来自分类Dev

打开的文件太多 - 如何找到罪魁祸首

来自分类Dev

RAM比CPU支持的速度慢吗?

来自分类Dev

iTunes OS X整个系统崩溃(续):坏的媒体文件是罪魁祸首吗?如何隔离它?

来自分类Dev

为什么对列表进行硬编码比计算速度慢?

来自分类Dev

巨大的电子表格 - 公式计算速度慢

来自分类Dev

PredicateBuilder确实会返回所有结果,并且找不到罪魁祸首

来自分类Dev

IIS 8 AppPool使用过多的资源,如何找到罪魁祸首?

来自分类Dev

Jenkins email-ext触发了导致罪魁祸首的电子邮件

来自分类Dev

连接池为空,休眠4,但找不到罪魁祸首

来自分类Dev

为什么PHP 5.5的OPcache显示零命中?suPHP是罪魁祸首?

来自分类Dev

未定义对“ shm_open”的引用-如何查明罪魁祸首?

来自分类Dev

Nginx代理+ NodeJS WebSocket +> 17KB消息。没有交通 谁是罪魁祸首?

来自分类Dev

鉴于以下事实,Prolog程序可找到犯罪的罪魁祸首

来自分类Dev

机器使用其他图形卡关闭;谁是罪魁祸首?

来自分类Dev

一个罪魁祸首文件夹正在更改“ ThisPc”视图设置

来自分类Dev

Ubuntu挂起并要求重启后,如何识别罪魁祸首?

来自分类Dev

“ while read”在文本文件中的各行之间循环,丢失了Bash脚本中的字符。是FFmpeg的罪魁祸首吗?

来自分类Dev

在大型文件流上处理速度慢吗?

来自分类Dev

用unityscript调用脚本速度慢吗?

来自分类Dev

如何通过查看visualVM中的内存事件探查器结果找到罪魁祸首类/对象

来自分类Dev

在ruby 2.0.0p247上替代'ruby-debug19'(罪魁祸首'linecache19')?

来自分类Dev

Xib需要很长时间(> 1s)加载。UIFont缓存似乎是罪魁祸首

来自分类Dev

脚本不是全局扩展的,但是作为简单示例运行罪魁祸首时,效果很好

来自分类Dev

资源管理器在Win 10 Ver 1511中反复崩溃:explorerframe.dll的罪魁祸首?

来自分类Dev

HighCharts / jQuery:chart.redraw速度慢-可以提高速度吗?

Related 相关文章

  1. 1

    寻找罪魁祸首

  2. 2

    Excel中假定为空单元格中的幻影数据(可能是罪魁祸首)

  3. 3

    Haskell计算Ackermann 4 1的速度慢吗?

  4. 4

    如何知道try块中的罪魁祸首?

  5. 5

    打开的文件太多 - 如何找到罪魁祸首

  6. 6

    RAM比CPU支持的速度慢吗?

  7. 7

    iTunes OS X整个系统崩溃(续):坏的媒体文件是罪魁祸首吗?如何隔离它?

  8. 8

    为什么对列表进行硬编码比计算速度慢?

  9. 9

    巨大的电子表格 - 公式计算速度慢

  10. 10

    PredicateBuilder确实会返回所有结果,并且找不到罪魁祸首

  11. 11

    IIS 8 AppPool使用过多的资源,如何找到罪魁祸首?

  12. 12

    Jenkins email-ext触发了导致罪魁祸首的电子邮件

  13. 13

    连接池为空,休眠4,但找不到罪魁祸首

  14. 14

    为什么PHP 5.5的OPcache显示零命中?suPHP是罪魁祸首?

  15. 15

    未定义对“ shm_open”的引用-如何查明罪魁祸首?

  16. 16

    Nginx代理+ NodeJS WebSocket +> 17KB消息。没有交通 谁是罪魁祸首?

  17. 17

    鉴于以下事实,Prolog程序可找到犯罪的罪魁祸首

  18. 18

    机器使用其他图形卡关闭;谁是罪魁祸首?

  19. 19

    一个罪魁祸首文件夹正在更改“ ThisPc”视图设置

  20. 20

    Ubuntu挂起并要求重启后,如何识别罪魁祸首?

  21. 21

    “ while read”在文本文件中的各行之间循环,丢失了Bash脚本中的字符。是FFmpeg的罪魁祸首吗?

  22. 22

    在大型文件流上处理速度慢吗?

  23. 23

    用unityscript调用脚本速度慢吗?

  24. 24

    如何通过查看visualVM中的内存事件探查器结果找到罪魁祸首类/对象

  25. 25

    在ruby 2.0.0p247上替代'ruby-debug19'(罪魁祸首'linecache19')?

  26. 26

    Xib需要很长时间(> 1s)加载。UIFont缓存似乎是罪魁祸首

  27. 27

    脚本不是全局扩展的,但是作为简单示例运行罪魁祸首时,效果很好

  28. 28

    资源管理器在Win 10 Ver 1511中反复崩溃:explorerframe.dll的罪魁祸首?

  29. 29

    HighCharts / jQuery:chart.redraw速度慢-可以提高速度吗?

热门标签

归档