无需附加函数的动态字典值

2024-03-29 12:59:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有时间戳的记录

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

子类dict如下:

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

编辑2:

Lambda函数就是我要找的。明显快于子类化,不幸的是慢于time()-timestamps[element],但它实现了我想要的。你知道吗

代码:

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

Tags: lambdainfor字典timedef时间range
1条回答
网友
1楼 · 发布于 2024-03-29 12:59:45

使用存储在时间戳旁边的lambda函数是我想要的。请理解,这不是一个实际的需要,只是一个任意的目标,即在不使用1)每次显式减法和2)不使用单独的命名函数的情况下获得经过的时间。你知道吗

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

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

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

相关问题 更多 >