访问内部字典时,大__getitem__开销?

时间:2015-03-09 08:44:00

标签: python dictionary overhead

我有以下地图类,它使用字典作为基础数据结构:

class Map:

''' A map object to handle the game world
'''

    def __init__(self, initial_grid=None, rooms=None, default=None):

        self.grid = initial_grid
        if not self.grid:
            self.grid = {}

        self.default = default

它有一个访问方法,试图从它的网格中获取信息,但如果它不能返回默认参数

    def __getitem__(self, key):
        return self.grid.get(key, self.default)

现在在我的代码的另一部分,我有这个函数运行了很多时间,给了我以下cProfile结果:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)

2510000    0.739    0.000    0.926    0.000 map.py:57(__getitem_ _)

2510001    0.187    0.000    0.187    0.000 {method 'get' of 'dict' objects}

如果我理解正确的话,函数中的大部分时间(~80%)都没有用于检索值,那么在那段时间内实际发生了什么?有什么方法可以改善吗?

1 个答案:

答案 0 :(得分:1)

有很多dict参与:self.grid__getitem(…),它从自我字典中获取网格,然后self.grid.get是另一个,最后self.default从自己获取default条目。

要减少get的数量,您可能需要在课程中添加以下内容:

__slots__ = ('grid', 'default') # add whatever field you have

这应该会大大加快您的代码速度,因为插槽访问简化为简单的数组访问。