我有一些要保存在球体表面坐标上的数据,所以我得到3个坐标,包括半径和数据。我想将此数据添加到围绕此点具有给定半径的球体上的每个坐标。但是代码很慢,不知道如何使其更快?
def Grid(x, y, z, r, data):
global voxelGrid
phi = 0
#set the surface here
z += surfaceZ
while phi <= (2*math.pi):
eta = math.pi * 2 / 3
while eta <= math.pi:
xx = x + r * math.sin(eta) * math.cos(phi)
yy = y + r * math.sin(eta) * math.sin(phi)
zz = z + r * math.cos(eta)
xx = int(round((xx)))
yy = int(round((yy)))
zz = int(round((zz)))
voxelGrid[xx][yy][zz] += data
eta += 1/10 * math.pi
phi += 1/10 * math.pi
所以我的第一个想法是制作一张查找表,因为我拥有的数据是这样的:我得到了X,Y,Z点,而不是一些不同的Radiuses和Data。不同的x,y,z位置的半径始终相同,因此每次对相同的数字进行此计算:
r * math.sin(eta) * math.cos(phi)
r * math.sin(eta) * math.sin(phi)
r * math.cos(eta)
所以我试图做一些查找表,但这只会使代码更慢(可能是因为我使用了全局变量):
def Grid(x, y, z, RadiusIndex, data):
global voxelGrid
global Phi
global Eta
global XX
global YY
global ZZ
etaIndex = 0
phiIndex = 0
z += surfaceZ
while phiIndex < len(Phi):
while etaIndex < len(Eta):
xx = x + XX[RadiusIndex][etaIndex][phiIndex]
yy = y + YY[RadiusIndex][etaIndex][phiIndex]
zz = z + ZZ[RadiusIndex][etaIndex]
xx = int(round((xx)))
yy = int(round((yy)))
zz = int(round((zz)))
voxelGrid[xx][yy][zz] += data
etaIndex += 1
phiIndex += 1
etaIndex = 0
我用一些小的testData和cProfile进行了测量:
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 1.449 1.449 <string>:1(<module>)
1 1.449 1.449 1.449 1.449 confutures.py:8(Grid)
1 0.000 0.000 1.449 1.449 {built-in method builtins.exec}
168 0.000 0.000 0.000 0.000 {built-in method math.cos}
168 0.000 0.000 0.000 0.000 {built-in method math.sin}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
我不太了解什么:内置方法builtins.exec 我认为我的主要问题是全局numpy数组,有什么方法可以做得更好?