如何解决Numba jit(parallel=True)装饰函数下time.process_time()计时不准确的问题
如何解决Numba jit(parallel=True)装饰函数下time.process_time()计时不准确的问题
这个问题我之前踩过同款坑!你遇到的情况完全是因为选了不对的计时函数——time.process_time()的统计逻辑和你要的"实际等待时间"根本不是一回事儿。
为什么time.process_time()会不准?
time.process_time()统计的是所有CPU核心为你的程序工作的总时间,简单说就是把每个并行线程的运行时间全部加起来。你有6个线程,那它就会把6个线程各自跑的时间累加在一起,所以你看到的90秒其实是6个线程耗时的总和,而你用手机掐的11秒才是真实的"从开始到结束的实际流逝时间"(也就是常说的墙钟时间)。
正确的计时方式
如果你想知道程序实际需要跑多久、和你手机掐表的结果对齐,直接换成time.perf_counter()就搞定了!这个函数专门用来测量真实的时间流逝长度,不管你开了多少并行线程,它的结果都会和你实际等待的时间基本一致。
修改后的代码示例
把你代码里的time.process_time()全部替换成time.perf_counter()就行,比如:
import time start_time = time.perf_counter() cubes_numba_dict = Dict.empty( key_type=types.UniTuple(types.int32, 3), value_type=types.float64[:,:] # Should be matrix ) cubes_numba_dict, x_grid, y_grid, z_grid = creating_dict(cubes_numba_dict, data_np, x_min, x_max, y_min, y_max, z_min, z_max, cube_width, sort_width_multiple) create_dict_time = time.perf_counter() print(f"It took: {create_dict_time-start_time} to create dictionary.")
额外小补充
如果之后你想分析程序的并行效率(比如看有没有充分利用多核),那time.process_time()的结果反而有用——用它的结果除以perf_counter()的结果,就能得到你实际用到的CPU核心数的近似值,帮你判断并行逻辑是不是真的跑满了算力。
备注:内容来源于stack exchange,提问作者Ninja Jim
相关产品推荐
相关产品推荐

