You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Numba字典查找速度比CPython慢16倍?

问题:Numba生成的字典查找速度比Python原生字典慢16倍的原因?

我做了如下简单实验:

import numba
import numpy as np
from numba import njit

@njit
def foo():
    d = dict()
    d[(1.0, 2)] = np.random.rand(500)
    return d

e = dict()
e[(1.0, 2)] = np.random.rand(500)
d = foo()

e和d均为仅含一个键的字典,性能测试结果如下:

In [42]: %timeit e[(1.0, 2)][3]
123 ns ± 2.86 ns per loop (mean ± std. dev. of 7 runs, 10,000,000 loops each)

In [43]: %timeit d[(1.0, 2)][3]
1.99 µs ± 50.3 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

使用的Numba版本为0.56.4,为什么Numba生成的字典查找速度慢了16倍?


回答

出现这种性能差距主要源于以下几点核心原因:

  • 字典实现的优化程度差异:Python原生字典是解释器的核心组件,经过数十年的极致优化,针对常见键类型(如元组)的哈希计算、冲突处理、内存布局都做了专门调校。而Numba的JIT字典是为适配编译环境独立实现的结构,在哈希效率、键匹配逻辑上远不如原生字典,尤其对于异构类型元组(比如示例中float+int的组合),Numba需要额外进行类型校验与转换,进一步拉高了开销。

  • 跨边界转换的额外开销:从Python解释器访问Numba生成的字典时,需要完成两次跨边界转换:一是把Python的元组键转换为Numba内部可识别的类型,二是把查找返回的NumPy数组从Numba内部存储转换为Python可见的对象。这两次转换的开销在单次查找耗时极短的场景下,占比会非常高,直接放大了性能差距。

  • 旧版本的特性限制:你使用的Numba 0.56.4是较早期的版本,后续版本(如0.59及以上)对字典性能做了不少优化,包括哈希函数改进、减少类型转换开销等。但即便如此,Numba字典在单键查找这类场景下,也很难追上原生Python字典的优化水平——毕竟原生字典的优化优先级和资源投入远高于Numba的字典实现。

如果你的场景对字典查找性能敏感,可尝试以下优化方向:

  1. 尽量将字典的操作逻辑都放在Numba JIT函数内部完成,避免在Python层频繁访问;
  2. 改用更适配Numba的键类型(如同构元组、整数),减少类型转换的开销;
  3. 升级到较新的Numba版本,享受官方的性能优化成果。

内容的提问来源于stack exchange,提问作者Simd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:57:23