当前位置: 首页 > 面试题库 >

Python字典要价多少钱?

乔宏峻
2023-03-14
问题内容

如标题所述,Python字典要处理多少费用?创建,插入,更新,删除全部。

渐近时间复杂性本身很有趣,但是它们与例如元组或正常列表的比较方式也很有趣。


问题答案:

dicts(就像sets,当您不需要将值关联到每个键,而只需记录一个键是否存在或不存在时)就进行了非常优化。dict根据N个键或键/值对创建a
O(N),提取is O(1),摊销摊销O(1)等。对于任何非微型容器,实际上都无法做得更好。

对于小型容器,您可以使用timeit基于基准的基准轻松检查边界。例如:

$ python -mtimeit -s'empty=()' '23 in empty'
10000000 loops, best of 3: 0.0709 usec per loop
$ python -mtimeit -s'empty=set()' '23 in empty'
10000000 loops, best of 3: 0.101 usec per loop
$ python -mtimeit -s'empty=[]' '23 in empty'
10000000 loops, best of 3: 0.0716 usec per loop
$ python -mtimeit -s'empty=dict()' '23 in empty'
10000000 loops, best of 3: 0.0926 usec per loop

这表明,检查空列表或元组中的成员资格比检查空集合或字典中的成员资格要快20-30纳秒。当每十亿分之一秒很重要时,此信息可能与您相关。往上一点…:

$ python -mtimeit -s'empty=range(7)' '23 in empty'
1000000 loops, best of 3: 0.318 usec per loop
$ python -mtimeit -s'empty=tuple(range(7))' '23 in empty'
1000000 loops, best of 3: 0.311 usec per loop
$ python -mtimeit -s'empty=set(range(7))' '23 in empty'
10000000 loops, best of 3: 0.109 usec per loop
$ python -mtimeit -s'empty=dict.fromkeys(range(7))' '23 in empty'
10000000 loops, best of 3: 0.0933 usec per loop

您会看到,对于7项容器(不包括感兴趣的容器),性能的平衡已经发生了变化,现在dicts和set具有上百纳秒的优势。存在感兴趣的物品时:

$ python -mtimeit -s'empty=range(7)' '5 in empty'
1000000 loops, best of 3: 0.246 usec per loop
$ python -mtimeit -s'empty=tuple(range(7))' '5 in empty'
1000000 loops, best of 3: 0.25 usec per loop
$ python -mtimeit -s'empty=dict.fromkeys(range(7))' '5 in empty'
10000000 loops, best of 3: 0.0921 usec per loop
$ python -mtimeit -s'empty=set(range(7))' '5 in empty'
10000000 loops, best of 3: 0.112 usec per loop

dicts和set并不会带来太多收益,但是tuples和list却能获得很大的收益,即使dicts和set仍然要快得多。

依此类推-
等等-timeit轻松运行微基准测试(严格地说,仅在纳秒确实很重要的极为罕见的情况下才需要保证,但是,这样做很容易,检查OTHER并不困难情况;-)。



 类似资料:
  • 问题内容: 抱歉,这个问题已经存在,但是我已经搜索了很长时间。 我在python中有一个字典,我想从列表中获取一些值,但是我不知道实现是否支持它。 但是有什么办法可以实现呢?在我的示例中,这看起来很简单,但是假设我有20个条目的字典,并且我想获得5个键。除了做别的办法 问题答案: 使用循环: 或列表理解:

  • 问题内容: 我正在尝试将几个文件加载到内存中。这些文件具有以下3种格式之一: 字符串TAB int 字符串TAB浮动 int TAB浮点数。 的确,它们是ngram静态文件,以防解决方案的出现。例如: 目前,我正在执行的伪代码是 令我惊讶的是,尽管磁盘中文件的总大小约为21 mb,但是将其加载到内存中时,该过程将占用120-180 mb的内存!(整个python应用程序不会将其他任何数据加载到内存

  • 这更像是一个良心问题,而不是一个技术问题:p我正在编写一些java代码来从服务器下载文件。。。为此,我使用了BufferedOutputStream方法write()和BufferedInputStream方法read()。 所以我的问题是,如果我使用缓冲区来保存字节,那么要读取的字节数应该是多少?当然,我可以使用int byte=read()逐字节读取,然后写入(byte),或者我可以使用缓冲区

  • 问题内容: 您知道Java中引发和处理异常的代价是多少? 我们在团队中就异常的实际成本进行了多次讨论。一些人尽可能地避免使用它们,有人说使用异常会导致性能损失被高估。 今天,我在我们的软件中找到了以下代码: 与之相比,它的性能如何 我不想讨论代码美感或其他任何内容,而只是关于运行时行为!您有真实的经验/测量方法吗? 问题答案: 我没有花时间去阅读Exception,但是用您的一些修改后的代码进行了

  • 问题内容: 我有两个字典,但为简单起见,我将采用以下两个字典: 现在,我想比较中的每一, 对是否x具有相同的对应值。所以我这样写: 而且它有效,因为tuple返回了a ,然后比较了相等性。 我的问题: 它是否正确?有更好的方法吗?最好不要提速,我是在讲代码优雅。 更新:我忘了提到我必须检查多少对是相等的。 问题答案: 如果你想知道两个字典中都匹配多少个值,你应该说:) 也许是这样的:

  • 主要内容:Python创建字典,Python 访问字典,Python删除字典Python 字典(dict)是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。相对地,列表(list)和元组(tuple)都是有序的序列,它们的元素在底层是挨着存放的。 字典类型是 Python 中唯一的映射类型。“映射”是数学中的术语,简单理解,它指的是元素之间相互对应的关系,即通过一个元素,可以唯一找到另一个元素。如图 1 所示。 图 1 映射关系示意图 字典中