我有一本字典:
d = {'a':1, 'b':2, 'c':3, 'd':4}
然后我有一个键列表:
l = ['a', 'b', 'z']
我想要的结果是:
[1, 2, None]
到目前为止,我正在做的是:
[d.get(k) for k in l]
有没有更快的方法?也许没有for
?
您可以使用:
>>> list(map(d.get, l))
[1, 2, None]
它有两个优点:
d.get
一次查询-不会每次迭代dict.get
是用C实现的,并且map
是用C实现的,因此可以避免在函数调用中使用Python层(大致来说,细节要复杂一些)。至于计时(在Jupyter笔记本中的Python 3.6上执行):
d = {'a':1, 'b':2, 'c':3, 'd':4}
l = ['a', 'b', 'z']
%timeit list(map(d.get, l))
594 ns ± 41.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit [d.get(k) for k in l]
508 ns ± 17.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
请注意,在这种情况下,这实际上要慢一些!那是因为总而言之,迭代map
和list
开销占主导。因此,如果您希望在较短的可迭代对象上更快,请坚持使用您的方法。
随着时间的推移,l
您会看到list(map(...))
最终变得更快:
d = {'a':1, 'b':2, 'c':3, 'd':4}
l = [random.choice(string.ascii_lowercase) for _ in range(10000)]
%timeit list(map(d.get, l))
663 µs ± 64.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit [d.get(k) for k in l]
1.13 ms ± 7.55 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
但是,这仍然“只是”快了2倍。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句