感谢来自这里的人们的帮助,我能够获得塔斯马尼亚骆驼拼图工作的代码.然而,它非常慢(我想.我不确定,因为这是我在Python中的第一个程序).在代码底部运行的示例需要很长时间才能在我的机器中解决:
dumrat@dumrat:~/programming/python$ time python camels.py
[['F', 'F', 'F', 'G', 'B', 'B', 'B'], ['F', 'F', 'G', 'F', 'B', 'B', 'B'],
['F', 'F', 'B', 'F', 'G', 'B', 'B'], ['F', 'F', 'B', 'F', 'B', 'G', 'B'],
['F', 'F', 'B', 'G', 'B', 'F', 'B'], ['F', 'G', 'B', 'F', 'B', 'F', 'B'],
['G', 'F', 'B', 'F', 'B', 'F', 'B'], ['B', 'F', 'G', 'F', 'B', 'F', 'B'],
['B', 'F', 'B', 'F', 'G', 'F', 'B'], ['B', 'F', 'B', 'F', 'B', 'F', 'G'],
['B', 'F', 'B', 'F', 'B', …Run Code Online (Sandbox Code Playgroud) 我第一次在这里发帖,所以希望我以正确的方式问我的问题,
将元素添加到Python字典后,是否可以让Python告诉您添加该元素是否导致了冲突?(在找到放置元素的位置之前,碰撞解决策略探测了多少个位置?)
我的问题是:我使用字典作为更大项目的一部分,经过大量的分析后,我发现代码中最慢的部分是处理使用字典实现的稀疏距离矩阵.
我正在使用的键是Python对象的ID,它们是唯一的整数,所以我知道它们都散列为不同的值.但是将它们放在字典中仍然可能导致原则上的冲突.我不相信字典冲突会减慢我的程序速度,但我想从我的查询中删除它们.
因此,例如,给出以下字典:
d = {}
for i in xrange(15000):
d[random.randint(15000000, 18000000)] = 0
Run Code Online (Sandbox Code Playgroud)
你能让Python告诉你创建它时发生了多少次碰撞吗?
我的实际代码与应用程序纠缠在一起,但上面的代码生成了一个与我正在使用的字典非常相似的字典.
重复:我不认为碰撞会减慢我的代码速度,我只是想通过显示我的字典没有多次碰撞来消除这种可能性.
谢谢你的帮助.
编辑:实现@Winston Ewert解决方案的一些代码:
n = 1500
global collision_count
collision_count = 0
class Foo():
def __eq__(self, other):
global collision_count
collision_count += 1
return id(self) == id(other)
def __hash__(self):
#return id(self) # @John Machin: yes, I know!
return 1
objects = [Foo() for i in xrange(n)]
d = {}
for o in objects:
d[o] = 1
print collision_count
Run Code Online (Sandbox Code Playgroud)
请注意,当您__eq__在类上定义时,TypeError: …