我尝试用以下代码对3D圆柱体的体素进行建模:
import math
import numpy as np
R0 = 500
hz = 1
x = np.arange(-1000, 1000, 1)
y = np.arange(-1000, 1000, 1)
z = np.arange(-10, 10, 1)
xx, yy, zz = np.meshgrid(x, y, z)
def density_f(x, y, z):
r_xy = math.sqrt(x ** 2 + y ** 2)
if r_xy <= R0 and -hz <= z <= hz:
return 1
else:
return 0
density = np.vectorize(density_f)(xx, yy, zz)
花了很多分钟来计算。在
相当于次优的Java代码运行10-15秒。在
如何让Python以相同的速度计算体素?在哪里优化?在
这是对迪帕克·赛尼的回答的长篇评论。在
主要的改变是不使用
np.meshgrid
生成的坐标,它包含不必要的重复。如果可以避免的话,这是不可取的(在内存使用和性能方面)编码
计时
^{pr2}$也可以使用函数的编译版本来计算密度。你可以用cython或numba。{a1}作为一个函数,可以很容易地将密度作为一个函数来编译。在
专业人士:
if
条件density.astype(int).sum()
中的和。在缺点:
代码:
运行时间:
正如评论中所建议的,我们也不需要计算网格。我们可以直接将
^{pr2}$x, y, z
传递给函数。因此:现在,为了公平比较,我们在@Willem Van Onsem的ans中也包含了
np.meshgrid
的时间。 运行时间:请不要使用
.vectorize(..)
,因为它仍将在Python级别进行处理,因此效率不高。.vectorize()
只能作为最后的手段使用,例如,如果函数不能以“bulk”的形式计算,因为它的“结构”太复杂了。在但是您不需要使用
.vectorize
在这里,您可以实现您的函数来处理数组:或者更快一点:
^{pr2}$这将构造一个2000×2000×20布尔数组。我们可以使用:
构造
int
s的数组在这里打印数组非常复杂,但它总共包含2'356'047个1:
基准测试:如果我在本地运行10次,我得到:
所以平均来说,我们在1.3-1.8秒内计算出这个矩阵(包括将它转换成
int
s)。在相关问题 更多 >
编程相关推荐