小编hug*_*gos的帖子

为什么dict查找总是比列表查找更好?

我使用字典作为查找表,但我开始怀疑列表是否会更适合我的应用程序 - 查找表中的条目数量不是那么大.我知道列表在引擎盖下使用C数组,这使我得出结论,在列表中只查找几个项目比在字典中更好(访问数组中的一些元素比计算哈希更快).

我决定介绍其他选择,但结果让我感到惊讶.列表查找只有单个元素才能更好!请参见下图(log-log plot):

list vs dict查找时间

所以问题就出现了:为什么列表查找执行得如此糟糕?我错过了什么?

在一个侧面问题上,在大约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 optimization performance big-o python-internals

41
推荐指数
2
解决办法
4677
查看次数

为什么hash(None)会在不同平台和不同调用中发生变化?

我在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版本上,但在不同的操作系统上它的行为也不同?

python hash python-internals

13
推荐指数
1
解决办法
425
查看次数

当使用std :: map我应该重载operator ==的密钥类型?

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)

c++ stl

10
推荐指数
1
解决办法
7250
查看次数

标签 统计

python ×2

python-internals ×2

big-o ×1

c++ ×1

hash ×1

optimization ×1

performance ×1

stl ×1