Python O(1)成员数据访问可能吗?

时间:2011-03-13 22:56:06

标签: python

在C ++中,为了访问“命名的”成员数据,我们不断地做:

const unsigned int CHEESE_CAKE = 0;
const unsigned int CHOCOLATE_CAKE = 1;
...
const unsigned int CHERRY_PIE = 1050;

然后,当我们想要访问与字符串匹配的某些特定资源时,我们可以简单地执行:

mResource[MyClass::CHEESE_CAKE]; // constant time O(1) access

我试图以类似的方式在python中执行此操作:

class MyClass:
    MY_CLASS_DATA1 = someData(1)
    MY_CLASS_DATA2 = someData(1)

但是根据我的理解,python的成员函数存储在__dict__中,它本质上是一个哈希映射,提供O(logn)查找时间。

有没有办法在python中实现O(1)性能,就像在C ++中一样,或者由于python的动态特性,这是不可能的?

4 个答案:

答案 0 :(得分:4)

正确的哈希表实现提供了分摊的O(1)查找时间。当您提到O(log n)时间时,您正在考虑二叉搜索树。 Python名称查找是O(1)。

答案 1 :(得分:3)

我认为这是你的幸运日:python词典的平均复杂度为O(1)(请参阅python wiki上的TimeComplexity)。您无需修改​​现有代码即可提高性能。

在一个稍微不相关的说明中,由于字典,python对象在内存使用方面与C ++有很大不同。 因此,如果您有内存问题和批次对象,您可以使用__slots__来改进它们;像往常一样,所有的优化都会延迟它们,直到你看到他们的需要为止,并且只有你可以衡量他们实际做了什么。

答案 2 :(得分:0)

不要担心成员查找性能,它足够快。在大多数情况下,字典查找可以安全地被认为是O(1)。

如果你想在窗口中抛出动态查找,你可以创建一个函数元组,并有符号变量来表示它们的索引。我想。

编辑: 另外,就速度而言,Python与C ++相比?仁慈,伙计!他们针对不同的事情!

答案 3 :(得分:0)

那么log n中的n是多少?它是dict中的成员数,只要它不那么大,通常就是这种情况,这可以说是O(1)