访问内部字典时开销大 __getitem__?
large __getitem__ overhead when accessing internal dictionary?
我有以下映射 class,它使用字典作为基础数据结构:
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
它有一个访问方法试图从它的网格中获取信息,但如果它不能returns默认参数
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%) 都没有花在检索值上,那么所有这些时间到底发生了什么?有什么改进方法吗?
涉及到很多dict:self.grid
是一个__getitem(…)
,它从self-dict中获取grid,然后self.grid.get
是另一个,最后是self.default
从自身获取 default
条目。
要减少 get
的数量,您可能需要将以下内容添加到您的 class:
__slots__ = ('grid', 'default') # add whatever field you have
这应该会大大加快您的代码速度,因为插槽访问已减少为简单的数组访问。
我有以下映射 class,它使用字典作为基础数据结构:
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
它有一个访问方法试图从它的网格中获取信息,但如果它不能returns默认参数
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%) 都没有花在检索值上,那么所有这些时间到底发生了什么?有什么改进方法吗?
涉及到很多dict:self.grid
是一个__getitem(…)
,它从self-dict中获取grid,然后self.grid.get
是另一个,最后是self.default
从自身获取 default
条目。
要减少 get
的数量,您可能需要将以下内容添加到您的 class:
__slots__ = ('grid', 'default') # add whatever field you have
这应该会大大加快您的代码速度,因为插槽访问已减少为简单的数组访问。