【问题标题】:Faster to assign dictionary value to variable, or continually access?更快地将字典值分配给变量,还是持续访问?
【发布时间】:2020-01-09 12:40:01
【问题描述】:

我有一本字典,例如:

d = {'a':'a-val', 'b':'b-val', 'c':'c-long-val'*1000}

而且我需要重复访问d['c'],如:

print('value of c is', d['c'])
x_queue.put(d['c'])
some_function(d['c'])

但我想知道将d['c'] 分配给变量并每次都使用它是否会更快:

c_value = d['c']` # is this assignment "worth it"?
print('value of c is', c_value)
x_queue.put(c_value)
some_function(c_value)

我的直觉是它可能取决于

  • d 中的元素数量(d 越大,查找密钥的成本越高)
  • d['c'] 的大小(分配更大的d['c'] 成本更高)

但我真的不确定这些选项中的一个(或另一个?)是 faster 还是 more pythonic

【问题讨论】:

  • 尝试、衡量和决定...
  • 谢谢,我可以(并且将)尝试衡量我的具体情况,但我仍然想知道为什么结果更好 - 如果确实如此。我对上述成本权衡的假设是否正确?
  • 在几乎所有语言中,从变量中获取值通常比从容器中检索值更快。
  • 一个只是从内存位置读取,另一个必须执行一些额外的计算。
  • 有一些例外,比如闭包中的变量,需要经过激活记录。

标签: python python-3.x performance dictionary


【解决方案1】:

键在字典中散列。所以当你要求 d['c'] 时,首先计算一个哈希值,然后找到相应的值。比一个简单的任务要多得多的步骤。

【讨论】:

    【解决方案2】:

    虽然通过键访问dict值的平均时间复杂度为O(1),但在发生后它的最坏情况时间复杂度为O(n)计算键的哈希值的开销。另一方面,变量赋值和检索其值需要非常短的恒定时间,因此尽可能避免通过键重新评估 dict 值。

    【讨论】:

    • 都是O(1),但是hash的系数更大。
    • 再次,当我提到 O(n) 时,我说的是从 dict 中检索值的 worst-case 时间复杂度计算哈希值后堆。
    • 换句话说,您将散列(需要 O(1))与散列冲突解决(需要 O(n)在最坏的情况下)。
    • Big-O 表示法在这里担心是错误的。忽略冲突解决,计算哈希值仍然比读取变量慢得多。
    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多