【发布时间】:2021-09-23 18:38:03
【问题描述】:
我需要存储一些这样的数据结构:
{'x1,y1,z1': [[p11_x,p11_y,p11_z], [p12_x,p12_y,p12_z], ..., [p1n_x,p1n_y,p1n_z]],
'x2,y2,z2': [[p21_x,p21_y,p21_z], [p22_x,p22_y,p22_z], ..., [p2n_x,p2n_y,p2n_z]],
...
'xn,yn,zn': [[pn1_x,pn1_y,pn1_z], [pn2_x,pn2_y,pn2_z], ..., [pnm_x,pnm_y,pnm_z]]}
每个键都是网格单元格索引,值是分类点列表。该列表可以是可变长度,但我可以将其设置为静态,例如 1000 个元素。
现在我尝试了这样的事情:
np.zeros(shape=(100,100,100,50,3))
但如果我将numba.jit 与该函数一起使用,则执行时间比纯 Python 差几倍。
我想做的简单 Python 示例:
def split_into_grid_py(points: np.array):
grid = {}
for point in points:
r_x = round(point[0])
r_y = round(point[1])
r_z = round(point[2])
try:
grid[(r_x, r_y, r_z)].append(point)
except KeyError:
grid[(r_x, r_y, r_z)] = [point]
return grid
numba 有什么有效的方法吗? 每 10 次执行循环时间如下:
- 号码:7.050494909286499
- 纯 Python:1.0014197826385498
使用相同的数据集,所以这是垃圾优化。
我的 numba 代码:
@numba.jit(nopython=True)
def split_into_grid(points: np.array):
grid = np.zeros(shape=(100,100,100,50,3))
for point in points:
r_x = round(point[0])
r_y = round(point[1])
r_z = round(point[2])
i = 0
for cell in grid[r_x][r_y][r_z]:
if not np.sum(cell):
grid[r_x][r_y][r_z][i] = point
break
i += 1
return grid
【问题讨论】:
标签: python numpy performance numba