快速Python代码可将数据保存在球面点上

时间:2018-08-10 15:34:23

标签: python

我有一些要保存在球体表面坐标上的数据,所以我得到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数组,有什么方法可以做得更好?

0 个答案:

没有答案