Python 设置哈希和 eq 默认调用策略

Python sets hash and eq default call strategy

提问人:Lahcen YAMOUN 提问时间:1/27/2023 更新时间:1/27/2023 访问量:33

问:

我遇到了一个问题,我需要优化代码的特定部分。我正在遍历一个调用的对象列表,对于每个对象,我正在调用一个将对象作为输入的函数。但是,我不想在类似的对象上多次调用该函数。最大调用数为 150,即使我没有处理所有对象,并且我不想使用全局计数器将验证委托给。 我有一个名为“lookup”的集合,我将其用作助手。我试图在两种方法之间做出决定:obsdo()do()do()

  • 验证对象是否在查找集中,如果不是,则添加它并对其调用 do() 函数。
  • 尝试将对象添加到查找集,如果集合的长度没有更改,请不要调用 do() 函数。 在这两种情况下,当集合的长度达到 150 时,我都会停止循环。

所以基本上对于第一种方法:

#obs is a list of my objects
def do(ob):
  #some work on ob
lookup = set()
for ob in obs:
  if ob not in lookup:
    lookup.add(ob)
    do(ob)
    if len(lookup) == 150:
      break

对于第二个:

#obs is a list of my objects
def do(ob):
  #some work on ob
lookup = set()
for ob in obs:
  old_len = len(lookup)
  lookup.add(ob)
  if len(lookup) != old_len:
    do(ob)
    if old_len+1 == 150:
      break

哪种方法更好,为什么?我知道第二种方法显然是最好的方法,因为我们在片场只通过一次,在第一种解决方案上可能通过两次。但事实真的如此吗?是每次必要时都调用默认值和方法,还是仅在第一次调用,并在内部使用备忘录私有变量以避免不必要的哈希和相等函数调用?__hash__()__eq__()

Python 优化 哈希 相等

评论


答: 暂无答案