c++ - 加速一个长的 python 代码,该代码被证明只是因为一个块而很慢
问题描述
我们有一个巨大的空间体积,充满了许多具有已知质量阵列('HI_mass')、3d 位置('HI_position')和一些有趣的分数('HI_fraction')的粒子(~ 10^8)。此卷中还有一些具有不同但已知的质量数组('mass_data')、位置('position_data')和大小('radius_data')的假想球体(~10^3)。
我们希望将每个假想球体中的所有气体粒子(对气体质量有部分贡献)相加,以得出上述每个假想球体的“gas_mass”。一旦我们为每个球体获得了这个质量,然后我们计算一些称为“sigma_HI”的量。如果这个数量高于某个阈值,那么我们会以 {id:mass} 字典的形式跟踪该球体的单个质量,以便稍后将其用于进一步计算。第三个块永远在整个代码的上下文中运行,这很长并且不包括在内;我只复制了被证明很慢的那部分代码。
import numpy as np
enclosing_circles_gas = {}
#info of imaginary spheres where *_data are stored arrays based on some random (otherwise positive integer) ids
for id, position, radius, mass zip(id_data, position_data, radius_data, mass_data):
if (mass >= low_mass_cutoff):
for i in np.where(HI_fraction > 0): # HI_fraction is a 1d array
gas_mass = 0
if (np.linalg.norm(HI_position[i] - position) <= radius): # HI_position and position: 3d array of particles and single sphere vector
gas_mass += HI_mass[i]*HI_fraction[i] # HI_mass and HI_fraction are 1d arrays of particles and their fractions
if (gas_mass/mass >= 1.0e-6):
enclosing_circles_gas[id] = float('{:.4f}'.format(mass))
我的问题是:如何使用 C++ 在 python 中转换这个非常慢的块来加速整个代码?
我尝试过的事情:将嵌套循环更改为列表理解(但这仍然很慢)
if (mass >= low_mass_cutoff):
gas_mass = sum( HI_mass[i]*HI_fraction[i] for i in np.where(HI_fraction > 0)[0] if (np.linalg.norm(HI_position[i] - position) <= radius))
if (gas_mass/mass >= 1.0e-6):
enclosing_circles_gas[id] = float('{:.4f}'.format(mass))
解决方案
您应该找到一种方法来记录循环各个部分的时间。但是,如果是字符串到字符串的双倍转换,那么以下从数字中截断数字而不是正确舍入的方法呢?
import math
def trunc_digits(x, digits):
d = math.log10(abs(x)) - digits
d = int(math.ceil(d))
d = math.pow(10, d)
m = math.fmod(x, d)
x = x - m
return x
x = 9.87654321e-6
print (x, "->", trunc_digits(x, 4))
y = 9.87654321e6
print (y, "->", trunc_digits(y, 4))
a = -1.87654321e-6
print (a, "->", trunc_digits(a, 4))
b = -1.87654321e6
print (b, "->", trunc_digits(b, 4))
推荐阅读
- android - 如何使用android studio 4将图像插入或加载到资源文件夹中的drawable文件夹?
- python - 遍历子文件夹并将文件格式从 txt 转换为 csv
- visual-studio-code - 在当前文件中粘贴另一个文件的内容
- javascript - 在输入上应用多个正则表达式模式并组合最终结果
- javascript - 如何使用打字稿将参数传递给 addEventListener 侦听器函数?
- java - 使用 CLion 调试 OpenJDK14:无法加载 CMake 项目
- mongodb - FIWARE Cygnus 对空间使用有任何问题吗?
- python - 主管不在容器内运行
- macos - gcc-10下架构x86_64的重复符号
- azure-devops - 我如何运行依赖于可以有条件地不运行的东西的作业?