您是否尝试过使用
__slots__?
从文档中:
默认情况下,新旧类的实例都具有用于存储属性的字典。这浪费了具有很少实例变量的对象的空间。创建大量实例时,空间消耗会变得非常大。
可以通过
__slots__在新式类定义中进行定义来覆盖默认值。该__slots__声明采用一系列实例变量,并在每个实例中仅保留足够的空间来容纳每个变量的值。因为__dict__未为每个实例创建空间,所以节省了空间。
那么,这样既节省时间又节省内存吗?
比较计算机上的三种方法:
test_slots.py:
class Obj(object): __slots__ = ('i', 'l') def __init__(self, i): self.i = i self.l = []all = {}for i in range(1000000): all[i] = Obj(i)
test_obj.py:
class Obj(object): def __init__(self, i): self.i = i self.l = []all = {}for i in range(1000000): all[i] = Obj(i)
test_dict.py:
all = {}for i in range(1000000): o = {} o['i'] = i o['l'] = [] all[i] = o
test_namedtuple.py(在2.6中受支持):
import collectionsObj = collections.namedtuple('Obj', 'i l')all = {}for i in range(1000000): all[i] = Obj(i, [])
运行基准测试(使用CPython 2.5):
$ lshw | grep product | head -n 1 product: Intel(R) Pentium(R) M processor 1.60GHz$ python --versionPython 2.5$ time python test_obj.py && time python test_dict.py && time python test_slots.pyreal 0m27.398s (using 'normal' object)real 0m16.747s (using __dict__)real 0m11.777s (using __slots__)
使用CPython 2.6.2,包括命名的元组测试:
$ python --versionPython 2.6.2$ time python test_obj.py && time python test_dict.py && time python test_slots.py && time python test_namedtuple.pyreal 0m27.197s (using 'normal' object)real 0m17.657s (using __dict__)real 0m12.249s (using __slots__)real 0m12.262s (using namedtuple)
因此,是的(不是很意外),使用
__slots__是一种性能优化。使用命名元组的性能与相似
__slots__。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)