字典与对象-哪个更有效,为什么?

字典与对象-哪个更有效,为什么?,第1张

字典与对象-哪个更有效,为什么?

您是否尝试过使用

__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__



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5630124.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存