调用Numba JIT函数后内存占用15MB,此理解是否正确?
关于Numba JIT函数调用内存开销的解释
你的理解不完全准确,这15MB内存并非函数调用本身的持续占用,而是Numba首次编译JIT函数时产生的一次性编译开销。
具体说明:
- 第一次调用被
@jit装饰的函数时,Numba会执行完整的编译流程:将Python代码转换为LLVM中间表示、优化生成机器码,这个过程中会创建大量编译相关的临时对象、缓存数据,这些都会占用内存。 - 你启用了
cache=True,编译结果会被持久化到磁盘缓存,但首次编译的内存开销依然存在;后续再次调用foo()时,内存增长会微乎其微,因为直接加载缓存的编译结果,无需重新编译。 tracemalloc统计的是从追踪开始到当前的累计内存分配量,这里的15MB是编译阶段的一次性开销,而foo()函数本身没有任何实际逻辑,运行时几乎不占用内存。
验证示例:
如果在代码中多次调用foo(),你会发现只有第一次调用会产生明显的内存增长:
import tracemalloc from numba import jit @jit(nopython=True, cache=True) def foo(): return tracemalloc.start() print(f"malloc before calling jitted function {tracemalloc.get_traced_memory()}") foo() print(f"malloc after first call {tracemalloc.get_traced_memory()}") foo() print(f"malloc after second call {tracemalloc.get_traced_memory()}") tracemalloc.stop()
你的原始代码及结果:
原始代码:
import tracemalloc from numba import jit @jit(nopython=True, cache=True) def foo(): return tracemalloc.start() print(f"malloc before calling jitted function {tracemalloc.get_traced_memory()}") foo() print(f"malloc after calling jitted function {tracemalloc.get_traced_memory()}") tracemalloc.stop()
运行结果:
malloc before calling jitted function (0, 0) malloc after calling jitted function (15085947, 15227418)
内容的提问来源于stack exchange,提问作者Harry van Langen
相关产品推荐
相关产品推荐

