加快一个长python代码的速度,因为只有一个块,所以速度很慢
Speed up a long python code that proves to be slow only due to a single block
我们有一个巨大的空间,里面充满了许多粒子(~10^8(,这些粒子具有已知的质量阵列("HI_mass"(、三维位置("HI_position"(和一些有趣的分数("HI_fraction"(。该体积中还有一些具有不同但已知质量阵列("mass_data"(、位置("position_data"(和大小("radius_data"(的假想球体(~10^3(。
我们想把每个假想球体中的所有气体粒子(对气体质量的贡献很小(加起来,得出上面提到的每个假想球体的"气体质量"。一旦我们得到了每个球体的质量,我们就计算出一个称为"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))
相关文章:
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 程序无法启动,因为缺少 libmpc-3.dll
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 无法为 X.radio 创建中等可视化,因为找不到网络节点可视化 - Omnet++
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- C++ 程序不会因为内存而终止
- 为什么这些算法的运行速度比它们应该的要快?
- 如何提高文件的读取速度?
- 加快一个长python代码的速度,因为只有一个块,所以速度很慢
- 因为一行不相关的代码,速度相差那么大