如何解决列表和字典之间的Python __getitem__性能
我已经实现了动态编程算法(自下而上)。
作为快速解决方案,我为DP表使用了字典而不是固定大小的数组,但是考虑到我的输入大小( n 最多为50k, m 最多为100),我认为将dp_table: Dict[int,Dict[int,float]]
重构为dp_table: List[List[float]]
有很多好处。
我们知道哈希表具有用于索引的运行时间O(1),但常量值为“高”,而列表索引为O(1),其常量要小得多。
dict.__getitem__
和list.__getitem__
之间的性能差异是什么?
使用numpy数组还能获得更多收益吗?
解决方法
使用timeit
进行基准测试非常简单。
>>> timeit.Timer('values[50]','values = {i: i for i in range(100)}').timeit(number = 10**7)
0.3076519769999999
>>> timeit.Timer('values[50]','values = list(range(100))').timeit(number = 10**7)
0.2913365720000005
>>> timeit.Timer('values[50]','import numpy; values = numpy.arange(100)').timeit(number = 10**7)
1.262765399000001
奇怪的是,这里的numpy数组执行得很糟糕。
, dict.__getitem__
和list.__getitem__
之间的性能差异是什么?
wiki.python article TimeComplexity声称具有以下时间复杂性:
- for
list
获取项目:平均情况O(1)摊销最差情况O(1) - for
dict
获取项目:平均情况O(1)摊销最坏情况O(n)
请记住,这些是CPython的值,其他python实现可能会有所不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。