Python 最有效的数据结构来保存值并检查值是否存在

Jam*_*Lin 1 python

假设我有数百万个字符串 ID,我想将它们存储在一个变量中并检查一个 ID 是否存在,我可以想到两种方法,list以及dict

使用list

>>> timeit_a = timeit.Timer('"9999999" in a', setup='a = [str(i) for i in range(3000000)]')
>>> timeit_a.timeit(1)
0.06293477199994868
Run Code Online (Sandbox Code Playgroud)

使用dict

>>> timeit_b = timeit.Timer('"9999999" in b', setup='b = {str(i): None for i in range(3000000)}')
>>> timeit_b.timeit(1)
3.860999981952773e-06  # equal to 0.00000386099
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,使用速度dict要快得多,但我觉得用dict一堆None仅仅为了利用键的哈希图而

有没有更规范、更优雅的方法来做到这一点?

cri*_*007 6

如果没有值,请使用 aset()而不是 dict

{str(i) for i in range(30000)}
Run Code Online (Sandbox Code Playgroud)

但是,如果您有数百万个项目,例如,也许卸载到 Redis 对于应用程序的内存使用/性能来说会更好

  • 我建议使用实际的“set”理解,而不是围绕生成器表达式的“set()”构造函数。`{str(i) for i in range(30000)}` 将运行得更快(它避免了在产量上保存和恢复生成器状态的开销)。`set(map(str, range(30000)))` 可能比这更快,但最好不要鼓励 `map` 来获得微不足道的收益(它只在特殊情况下提供收益;任何时候你必须使用理解可以内联的“lambda”)。 (3认同)