我正在使用具有几个属性的Python对象来组织数据模型,但我想知道这是否比使用基于密钥的字典效率低。我的模型存储MP3标签数据,看起来像这样:
class Mp3Model:
def __init__(self, path, filename):
self.path = path
self.filename = filename
self.artist = ''
self.title = ''
self.album = ''
self.tracknumber = ''
self.genre = ''
self.date = ''
该模型如下使用:
mp3s = []
for file in files:
if os.path.splitext(file)[1] == '.mp3':
# Append a new Mp3Model to the mp3s list for each file found
mp3s.append(Mp3Model(os.path.join(self.dir, file), file))
使用基于密钥的字典,甚至是简单的列表可以提供更多的性能提升吗? mps []对象列表的长度是高度可变的,具体取决于在给定目录中找到多少文件,当我用大量文件扫描目录时,程序可以慢慢爬行(我还没有实现任何线程)
答案 0 :(得分:5)
除非您为对象声明__slots__
,否则对象属性无论如何都会存储在基础dict
中,因此使用dict
会略微快于对象。但是,与其他代码相比,差异可以忽略不计。
数据结构的选择应取决于其他各种因素:
针对您的用例进行优化将带来更高的回报。
答案 1 :(得分:2)
使用dict比使用类更有效。您可以避免处理类的所有开销,属性访问等。更不用说,通过键访问字典中的项目是python中最有效和优化的代码之一。
但有几点需要注意:
答案 2 :(得分:0)
这只是猜测,但我认为瓶颈可能是从os中读取文件,而不是构建列表。
话虽如此,您只需创建一个包含所有文件名的列表并将性能与构建带有文件名的对象列表进行比较即可对其进行测试。
答案 3 :(得分:0)
在您断定代码的任何特定部分是慢速部分之前,请对程序进行概要分析。它可能是你最内层的循环,但是测试这个假设,不要只是跳过它。
对于CPU绑定的负载,请尝试Pypy。
对于I / O绑定的加载,尝试缓存,或以某种方式将大量小文件聚合到较少数量的大文件中。与读取一些顺序数据相比,开放趋于缓慢。
HTH
答案 4 :(得分:0)
我不知道另一种方法是否更好。 你可以按照以下方式做到这些;
from collections import namedtuple
Mp3Model = namedtuple("Mp3Model", "path filename artist title")
它可以创建简单的 Mp3Model 类。