有谁知道如何实现python的内置字典类型?我的理解是它是某种哈希表,但我无法找到任何确定的答案.
这是我几天前给出的回答的后续问题.编辑:似乎该问题的OP已经使用了我发给他的代码来问同样的问题,但我没有意识到它.道歉.提供的答案虽然不同!
我基本上观察到:
>>> def without_else(param=False):
... if param:
... return 1
... return 0
>>> def with_else(param=False):
... if param:
... return 1
... else:
... return 0
>>> from timeit import Timer as T
>>> T(lambda : without_else()).repeat()
[0.3011460304260254, 0.2866089344024658, 0.2871549129486084]
>>> T(lambda : with_else()).repeat()
[0.27536892890930176, 0.2693932056427002, 0.27011704444885254]
>>> T(lambda : without_else(True)).repeat()
[0.3383951187133789, 0.32756996154785156, 0.3279120922088623]
>>> T(lambda : with_else(True)).repeat()
[0.3305950164794922, 0.32186388969421387, 0.3209099769592285]
Run Code Online (Sandbox Code Playgroud)
......或换句话说:else无论if条件是否被触发,使条款更快.
我假设它与两者生成的不同字节码有关,但有人能够详细确认/解释吗?
编辑:似乎不是每个人都能重现我的时间,所以我认为在我的系统上提供一些信息可能是有用的.我正在安装默认的python运行Ubuntu 11.10 64位.python …
>>> one_decimal = Decimal('1')
>>> one_complex = complex(1,0)
>>> d = {one_decimal: '1D', one_complex: '1C'}
>>> len(d)
2
>>> map(hash, d)
[1, 1]
Run Code Online (Sandbox Code Playgroud)
上面,我创建了一个带有哈希冲突的dict,并占用了两个插槽.
>>> d[1]
'1D'
>>> d[1+0j]
'1C'
Run Code Online (Sandbox Code Playgroud)
如何处理整数的getitem 1?索引如何设法解决复杂文字索引的正确值?
Python 2.7.12/Linux.
在我的程序中,我需要存储与许多(我们谈论数十万、数百万)游戏板状态相关的数据。为此,我使用字典。
class BoardState(object):
def __init__(self, ...):
# ...
self.board = [ [ None ] * self.cols for _ in xrange(self.rows) ]
def __hash__(self):
board_tuple = tuple([ tuple(row) for row in self.board ])
return hash(board_tuple)
# ...
Run Code Online (Sandbox Code Playgroud)
self.board在我的主要用例中,是一个 2D 列表,有 6 行和 7 列。
一开始我dict用BoardState对象索引了。但由于除了将来的查找之外,我不会将BoardState存储的对象dict用于其他目的,因此我注意到我可以通过索引来节省内存hash(board_state)(此版本使用的内存减少了 4 倍)。
BoardState两个不同的对象(内部有不同的boards)在 ing 后产生相同值的可能性有多大hash?
为了澄清一点,这就是我存储和检索值的方式dict:
board_state = BoardState(...)
my_values[hash(board_state)] = { ... }
...
other_val_with_board_state = source_function() …Run Code Online (Sandbox Code Playgroud) Python如何存储dict键,在哈希表中发生冲突时的值?什么是用于获取哈希值的哈希算法?
我想知道python dict(字典/哈希表)是如何实现的。特别是如果我写类似
my_dict = {"key": {"key: {"key": "value"}}}
Run Code Online (Sandbox Code Playgroud)
python解释器可能做什么?我想知道它的内部运作。
是否将每个字典都视为一个对象(通常是)?如果是这样,那么跨不同词典的相同键的哈希值是否相同?例如
dict1 = {"key": "value", "k": "v"}
dict2 = {"key": [1, 2.], "k": "value"}
Run Code Online (Sandbox Code Playgroud)
在这两个不同的字典中对键的查找有何不同?另外,它如何确定铲斗的尺寸?还是类似于列表大小的处理?希望你能回答我的问题。谢谢!
编辑 -不,我不是问哈希表如何工作。我知道那部分。
参加这个超级简单的课程:
class Foo():
def __init__(self, iden):
self.iden = iden
def __hash__(self):
return hash(self.iden)
def __repr__(self):
return str(self.iden)
Run Code Online (Sandbox Code Playgroud)
目标是创建类的实例以用作字典键。如果__repr__省略,则键是标准对象地址。可__repr__打印的表示可能是:
f = Foo(1)
g = Foo(2)
d = {f:'a', g:'b'}
print(d)
>>> {1:'a', 2:'b'}
Run Code Online (Sandbox Code Playgroud)
__repr__然而,当尝试通过键访问字典时,如何利用(或__str__就此而言)表示形式作为键似乎并不是立即显而易见的。
print(d[1])
>>> KeyError
Run Code Online (Sandbox Code Playgroud) python ×7
dictionary ×5
hashtable ×2
python-2.7 ×2
hash ×1
hashmap ×1
optimization ×1
python-2.x ×1
python-3.x ×1