没有附加函数调用的动态字典值

时间:2017-10-30 21:00:02

标签: python dictionary

我有时间戳的字典

timestamp = time.time()
timestamps[random_element] = timestamp

通常现在字典会在被询问时返回时间戳,但是,我希望它返回自时间戳以来的时间量。所以当我执行以下行时:

timestamps[random_element]

我想得到

time.time() - timestamp

而不仅仅是

timestamp

请注意,我宁愿避免声明和引用新功能。在我看来,只为一次减法调用一个函数是一个巨大的浪费。

编辑: 正如coldspeed和DeepSpace所指出的那样,子类化实际上更慢(大约30%),看似独立于字典大小和对字典的调用量。这可能是偏离主题的,但我想知道为什么会出现这种情况。欣赏见解

time() - timestamps[randint(0,9)]:   10.2322190305
subclassed_timestamps[randint(0,9)]: 13.268092648

子类词是:

class MyDict(dict):
def __getitem__(self, key):
    return time() - dict.__getitem__(self, key)

编辑2:

Lambda函数就是我想要的。显然比子类化更快,不幸的是比time() - 时间戳[元素]慢,但它做了我想要的。

代码:

for i in range(10000):
  normal_dict[i]= time()
  subclassed_dict[i] = time()
  lambda_dict[i] = (lambda x,y: x - y, time())
  sleep(0.002)

def normal_d():
  for i in range(1000):
    x = time() - normal_dict[555]

def subclassed_d():
  for i in range(1000):
    x = subclassed_dict[555]

def lambda_d():
  for i in range(1000):
    x = lambda_dict[555][0](lambda_dict[555][1])

print "lambda_timestamps[randint(0,9)]:     {}".format(timeit(lambda_d, number=10000))
print "time() - timestamps[randint(0,9)]:   {}".format(timeit(normal_d, number=10000))
print "subclassed_timestamps[randint(0,9)]: {}".format(timeit(subclassed_d, number=10000))

与子类化相比,这始终使用lambda作为更快的选项带来解决方案。

lambda_timestamps[randint(0,9)]:     2.19382280125
time() - timestamps[randint(0,9)]:   0.962934452287
subclassed_timestamps[randint(0,9)]: 3.92690390754

1 个答案:

答案 0 :(得分:0)

使用存储在时间戳旁边的lambda函数是我正在寻找的。请理解这不是一个实际需要,只是一个任意目标,即在没有使用单独的命名函数的情况下明确减去每次和2)的时间来传递时间。

timestamps[indx] = (lambda x: time() - x, time())

x = timestamps[indx][0](timestamps[indx][1])

我理解这会损害可读性,但这是一个纯粹的理论问题,不适用于实际应用,所以这不是一个问题。我只是在探索Python:)