减少此功能的运行时间?
我想减少下面的代码的运行时间。有人可以提供任何提示我如何做到这一点?减少此功能的运行时间?
def sample(BODIES, iterations):
dt = 0.01
TOTAL_BODIES = BODIES.keys()
for _ in range(iterations):
seenit = dict()
for body1 in TOTAL_BODIES:
([x1, y1, z1], v1, m1) = BODIES[body1]
for body2 in TOTAL_BODIES:
if (body1 != body2) and not (body2 in seenit):
([x2, y2, z2], v2, m2) = BODIES[body2]
(dx, dy, dz) = (x1 - x2, y1 - y2, z1 - z2)
tmp = dt * ((dx * dx + dy * dy + dz * dz) ** (-1.5))
m2_tmp = m2 * tmp
m1_tmp = m1 * tmp
v1[0] -= dx * m2_tmp
v1[1] -= dy * m2_tmp
v1[2] -= dz * m2_tmp
v2[0] += dx * m1_tmp
v2[1] += dy * m1_tmp
v2[2] += dz * m1_tmp
seenit[body1] = True
我运行的Python 3.5 100000次迭代,但机构的规模较小(4元)
编辑:这是最快的版本,我可以得到的。
def sample(BODIES, iterations, dt):
for _ in range(iterations):
for body1, body2 in combinations(BODIES, 2):
([x1, y1, z1], v1, m1) = BODIES[body1]
([x2, y2, z2], v2, m2) = BODIES[body2]
dx = x1-x2
dy = y1-y2
dz = z1-z2
tmp = dt * ((dx * dx + dy * dy + dz * dz) ** (-1.5))
m2_tmp = m2 * tmp
m1_tmp = m1 * tmp
v1[0] -= dx * m2_tmp
v1[1] -= dy * m2_tmp
v1[2] -= dz * m2_tmp
v2[0] += dx * m1_tmp
v2[1] += dy * m1_tmp
v2[2] += dz * m1_tmp
首先,如果你想提高你的代码的速度,你需要知道为什么/哪里东西是缓慢的。所以你需要措施。我会建议使用线剖析器。
但是通常最好的改进方法是以不同的方式做事。 您应该看看如何使用numpy
数组获取数据。 这会使代码更简单,并将循环从Python移动到用C编写的numpy扩展。
有人告诉我,使用听写会比运行数组快吗?这不正确吗? –
@SaurabhMahajan:为什么字典会更快?通常字典也需要一些逻辑来执行查找。 –
@WillemVanOnsem我会试试看看我得到的差异有多大 –
要在这里获得答案的机会很多,您确实需要提供更多信息。这个函数做什么?它需要什么输入?它的输出是什么?你有没有分析功能,看看哪些部分花费最多时间? – Blckknght
@Blckknght它运行大量(100,000)迭代并将字典作为输入。更新v1和v2的操作在每次迭代中最长约为0.15。 –
我怀疑那些时间最长。这只是数学运算。你的嵌套for循环需要最长的时间 –