【问题标题】:Python __getitem__ performance between lists and dicts列表和字典之间的 Python __getitem__ 性能
【发布时间】:2020-12-07 17:38:28
【问题描述】:

我已经实现了一个动态编程算法(自下而上)。
作为快速修复,我对 DP 表使用了字典而不是固定大小的数组,但考虑到我的输入大小(n 高达 50k,m 高达 100),我认为将dp_table: Dict[int, Dict[int, float]] 重构为dp_table: List[List[float]] 会有很多好处。

我们知道哈希表的索引运行时间为 O(1),但常数值“高”,而列表索引的运行时间为 O(1),并且常数应该小得多。

dict.__getitem__list.__getitem__ 之间的性能差异是什么?
使用 numpy 数组还有更多好处吗?

【问题讨论】:

  • 性能差异将是常数的变化。您是否尝试过自己运行任何基准测试?
  • 我希望这种无处不在的操作的性能基准已经存在,但我找不到任何东西。

标签: python arrays performance hashmap dynamic-programming


【解决方案1】:

使用timeit 进行基准测试非常简单。

>>> timeit.Timer('values[50]', 'values = {i: i for i in range(100)}').timeit(number = 10**7)
0.3076519769999999
>>> timeit.Timer('values[50]', 'values = list(range(100))').timeit(number = 10**7)
0.2913365720000005
>>> timeit.Timer('values[50]', 'import numpy; values = numpy.arange(100)').timeit(number = 10**7)
1.262765399000001

奇怪的是,numpy 数组在这里的表现很糟糕。

【讨论】:

    【解决方案2】:

    dict.__getitem__list.__getitem__ 之间的性能差异是什么?

    wiki.python article TimeComplexity 声明时间复杂度:

    • for list 获取项目:平均情况 O(1) 摊销最坏情况 O(1)
    • for dict 获取项目:平均情况 O(1) 摊销最坏情况 O(n)

    请记住,这些是 CPython 的值,其他 python 实现可能会有所不同。

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多