在实例化和检索元素时,元组和列表之间是否存在性能差异?
在内存使用和CPU消耗方面,Python的效率更高 - 词典还是对象?
背景: 我必须将大量数据加载到Python中.我创建了一个只是一个字段容器的对象.创建4M实例并将它们放入字典大约需要10分钟和大约6GB的内存.字典准备好后,访问它是一眨眼.
示例: 为了检查性能,我编写了两个执行相同操作的简单程序 - 一个是使用对象,另一个是字典:
对象(执行时间~18秒):
class Obj(object):
def __init__(self, i):
self.i = i
self.l = []
all = {}
for i in range(1000000):
all[i] = Obj(i)
Run Code Online (Sandbox Code Playgroud)
字典(执行时间~12秒):
all = {}
for i in range(1000000):
o = {}
o['i'] = i
o['l'] = []
all[i] = o
Run Code Online (Sandbox Code Playgroud)
问题: 我做错了什么或字典比对象更快?如果确实字典表现更好,有人可以解释为什么吗?
在Python 3.3中实现的PEP 412引入了对属性字典的改进处理,有效地减少了类实例的内存占用. __slots__是为了相同的目的而设计的,那么使用它还有什么意义__slots__吗?
为了自己找出答案,我运行了以下测试,但结果没有多大意义:
class Slots(object):
__slots__ = ['a', 'b', 'c', 'd', 'e']
def __init__(self):
self.a = 1
self.b = 1
self.c = 1
self.d = 1
self.e = 1
class NoSlots(object):
def __init__(self):
self.a = 1
self.b = 1
self.c = 1
self.d = 1
self.e = 1
Run Code Online (Sandbox Code Playgroud)
Python 3.3结果:
>>> sys.getsizeof([Slots() for i in range(1000)])
Out[1]: 9024
>>> sys.getsizeof([NoSlots() for i in range(1000)])
Out[1]: 9024
Run Code Online (Sandbox Code Playgroud)
Python 2.7结果:
>>> sys.getsizeof([Slots() for i in …Run Code Online (Sandbox Code Playgroud) 我听说__slots__通过避免字典查找使对象更快.我的困惑来自于Python是一种动态语言.在静态语言中,我们a.test通过执行编译时优化来避免字典查找,以便在我们运行的指令中保存索引.
现在,在Python中,a可以很容易地成为另一个具有字典或不同属性集的对象.看起来我们仍然需要进行字典查找 - 唯一的区别似乎是我们只需要一个类的字典,而不是每个对象的字典.
有了这个理性,
__slots__避免字典查找?