Python Dictionary DataStructure哪个方法d []或d.get()?

ifi*_*hat 16 python data-structures

使用Python Dictionary DataStructure(包含键值对)如果我想从我的词典中检索一些值我有两个选项d ['']和g.get('key')所以我现在很困惑哪个更好,为什么?我对某种方式都有所了解,但是当涉及到内存消耗和内存评估哪个更好?

希望得到一些积极的回复,

问候.

Ray*_*oal 31

来自Python Library Docs

d[key]
用钥匙 返回d .引发KeyErrorif 不在地图中.

如果字典的子类定义了一个方法__missing__(),如果键不存在时,在d[key]操作调用与所述密钥方法作为参数.该d[key]操作然后返回或引发任何退回或募集的__missing__(key)通话如果该键不存在.没有其他操作或方法调用__missing__().如果__missing__()未定义,KeyError则引发.__missing__()必须是一种方法; 它不能是实例变量.[...]

get(key[, default])
如果key在字典中,则 返回key的值,否则返回default.如果未给出default,则默认为,因此此方法永远不会引发a .NoneKeyError

不同之处在于回报价值.当您要求与不存在的键对应的值时,您要么想要

  1. 一个KeyError凸起的
  2. 调用了一个回调
  3. 返回默认值

Python通过多种方法提供不同的功能.

[]找不到密钥时,无论是在调用_missing_还是引发异常时,都会遇到性能损失.至于密钥IS出现时哪一个更快,我检查了源代码.(这次检查使用了2.7.2.)dictobject.c我们看到:

  • get 电话 dict_get
  • [] 电话 dict_subscript

现在,如果值存在,dict_get我们有

if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &failobj))
    return NULL;

if (!PyString_CheckExact(key) ||
    (hash = ((PyStringObject *) key)->ob_shash) == -1) {
    hash = PyObject_Hash(key);
    if (hash == -1)
        return NULL;
}
ep = (mp->ma_lookup)(mp, key, hash);
Run Code Online (Sandbox Code Playgroud)

而且dict_subscript我们有

assert(mp->ma_table != NULL);
if (!PyString_CheckExact(key) ||
    (hash = ((PyStringObject *) key)->ob_shash) == -1) {
    hash = PyObject_Hash(key);
    if (hash == -1)
        return NULL;
ep = (mp->ma_lookup)(mp, key, hash);
Run Code Online (Sandbox Code Playgroud)

唯一的区别是,get额外的解包元组!

重大?我不知道.:-)

  • 注意`.get()`是方法查找和调用,而`[..]`是在字节码中实现的.由于这些原因,这使得"存在密钥"的情况下订阅更快. (3认同)
  • 使用timeit.timeit(stmt ='b = a ["x"]',setup ='a = {"x":"hello world"}',number = 10000和100000),然后将stmt修改为a .get("x","") - 使用[]和.get之间的时差快3-4倍 (2认同)

inf*_*red 6

如果'key'字典中不存在,

d['key']

将抛出KeyError, while

d.get('key')

将返回None