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

在字典中使用字符串作为键总是更快吗?

卫鸿朗
2023-03-14
问题内容

在此页面上,我看到了一些有趣的东西:

请注意,有一种快速的命令可以(实际上)仅处理str键。 这不会影响算法的复杂性,但是会显着影响以下恒定因素:典型程序完成的速度。

那到底是什么意思呢?

这是否意味着使用字符串作为键总是更快?

如果是,为什么?

更新:

感谢您提供有关优化的建议!但实际上,我对简单的事实更感兴趣,而不是是否或何时进行优化。

更新2:

感谢您的出色回答,在这里我将引用@DaveWebb提供的链接中的内容:

“ …

ma_lookup 最初设置为 lookdict_string 函数(在3.0中重命名为 lookdict_unicode
),它假定字典中的键和要搜索的键都是标准的PyStringObject。然后,由于字符串之间的比较不会引发异常,因此它可以进行一些优化,例如减轻各种错误检查。同样也不需要进行富对象比较,这意味着我们避免调用
PyObject_RichCompareBool ,而始终直接使用 _PyString_Eq

…”

另外,对于实验编号,如果没有int到字符串的转换,我认为差异的大小会更大


问题答案:

Python字典下的C代码针对String键进行了优化。 您可以在此处(和博客所指的书中)中阅读有关内容。

如果Python运行时知道您的字典仅包含字符串键,则它可以执行某些操作,例如不解决字符串与字符串比较不会发生的错误,并忽略丰富的比较运算符。这将使字符串键的普通情况仅dict快一点。(更新:时间表明它要多一些。)

但是,这不太可能对大多数Python程序的运行时间产生重大影响。仅当您测量并发现dict查找是代码中的瓶颈时,才担心此优化。
正如名言所说:“过早的优化是万恶之源。”

要查看实际速度有多快的唯一方法是计时它们:

>>> timeit.timeit('a["500"]','a ={}\nfor i in range(1000): a[str(i)] = i')
0.06659698486328125
>>> timeit.timeit('a[500]','a ={}\nfor i in range(1000): a[i] = i')
0.09005999565124512

因此,使用字符串键甚至比使用键大约快30%int,我不得不承认我对这种差异的大小感到惊讶。



 类似资料:
  • 问题内容: 字典键要求符合性: 如何获得纯Swift类实例的地址用作? 问题答案: 可以将相等实现为对象标识,即iff 并引用该类的相同实例,并且可以从构造哈希值(对于相同的对象,该值相同,请比较,例如,使用ObjectIdentifier()和’===’运算子 对于Swift 4.2及更高版本: 对于Swift 3: 对于Swift 2.3及更早版本,您可以使用 即 例: 实施协议。

  • 问题内容: 我的问题与这一问题非常相似,除了我有一个列表字典,而且我有兴趣将键值和每个列表形式中的所有元素都更改为。 因此,例如,我想要字典: 成为: 这可能吗? 由于我是从格式文件创建此字典的,因此更一般 具有以下说明: 有没有一种方法可以在加载时直接进行? 问题答案: 用于值列表 在您的情况下: 要么

  • 问题内容: 这里是Python新手。我想知道是否有人可以在使用字典进行字符串插值时得到帮助。 上面的工作正常,并产生: 但是,请执行以下操作: 结果是: 因此,问题似乎出在将数字键解释为列表索引恕我直言。 有什么办法可以解决此问题? (即表示这是一个字典键) 如果您曾经问​​过这个问题,TIA表示歉意(找不到与我的搜索相关的任何内容)。 编辑1:密钥不是前面错误指出的数字。相反,它是数字的字符串表

  • 本文介绍:快捷键字符串 使用globalShortcut中的register绑定快捷键. 快捷键字符串 多个则采用 + 连接,例如: CommandOrControl+A CommandOrControl+Shift+Z 例子: 1 const {app, globalShortcut} = require('electron') 2 ​ 3 app.on('ready', () => { 4 /

  • 问题内容: 具体来说,我正在尝试使用字符串任意过滤ORM。我已经尝试过exec和eval解决方案,但是我遇到了麻烦。下面的代码不起作用,但这是我知道如何解释我要去的地方的最好方法 问题答案:

  • 问题内容: 这个问题与Python类似-在字典中查找最长(最多单词)键-但我需要纯字符数。 输入示例: 输出: 问题答案: 替代方法,与@jamylak的解决方案一样快,并且使用更多的pythonic: 查看比较: