我使用字典作为查找表,但我开始怀疑列表是否会更适合我的应用程序 - 查找表中的条目数量不是那么大.我知道列表在引擎盖下使用C数组,这使我得出结论,在列表中只查找几个项目比在字典中更好(访问数组中的一些元素比计算哈希更快).
我决定介绍其他选择,但结果让我感到惊讶.列表查找只有单个元素才能更好!请参见下图(log-log plot):
所以问题就出现了:为什么列表查找执行得如此糟糕?我错过了什么?
在一个侧面问题上,在大约1000个条目之后,在dict查找时间中引起我注意的其他东西是一个小"不连续".我单独绘制了dict查找时间来显示它.
ps1我知道数组和散列表的O(n)vs O(1)摊销时间,但通常情况下,迭代数组的少量元素比使用散列表更好.
ps2这是我用来比较字典和列表查找时间的代码:
import timeit
lengths = [2 ** i for i in xrange(15)]
list_time = []
dict_time = []
for l in lengths:
list_time.append(timeit.timeit('%i in d' % (l/2), 'd=range(%i)' % l))
dict_time.append(timeit.timeit('%i in d' % (l/2),
'd=dict.fromkeys(range(%i))' % l))
print l, list_time[-1], dict_time[-1]
Run Code Online (Sandbox Code Playgroud)
ps3使用Python 2.7.13
我在Python上使用哈希函数面临一个非常奇怪的行为.当我在Mac OS(10.10)上运行以下命令时,我从不同的调用中获得不同的值.
$ python -c "print hash(None)"
-9223372036579216774
$ python -c "print hash(None)"
-9223372036582852230
Run Code Online (Sandbox Code Playgroud)
另一方面,当我在Ubuntu 14.04上运行相同的东西时,我得到:
$ python -c "print hash(None)"
596615
$ python -c "print hash(None)"
596615
Run Code Online (Sandbox Code Playgroud)
对我来说,看起来,在OS X中,python以某种方式使用内存地址而Ubuntu则不然.从中我可以看出哈希函数可能依赖于实现.但是,它不应该只基于"无"的"价值"吗?这些数字代表什么?为什么即使在相同的python版本上,但在不同的操作系统上它的行为也不同?
std :: map不应该有重复的键,所以当我有自定义类型时,它如何知道我有一个重复的键,我需要做重载重载运算符==?或者它将被隐式创建?
根据文档,我只需要操作员<但这不足以维持密钥的独特性.
考虑这个例子:
class MyType{
public:
MyType(int newId){
id = new int;
*id = newId;
};
~MyType{
delete id;
}
private:
int* id;
};
int main(){
std::map<MyType,int> myMap;
std::pair<std::map<MyType,int>::iterator,bool> ret;
ret = myMap.insert ( std::pair<MyType,int>(myType(2),100) );
if (!ret.second) {//now how can he knows that?
std::cout << "element already existed" << endl;
}
}
Run Code Online (Sandbox Code Playgroud)