基于大键的词典与具有属性的对象列表的性能

时间:2012-08-16 15:14:27

标签: python oop python-2.7

我正在使用具有几个属性的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 []对象列表的长度是高度可变的,具体取决于在给定目录中找到多少文件,当我用大量文件扫描目录时,程序可以慢慢爬行(我还没有实现任何线程)

5 个答案:

答案 0 :(得分:5)

除非您为对象声明__slots__,否则对象属性无论如何都会存储在基础dict中,因此使用dict会略微快于对象。但是,与其他代码相比,差异可以忽略不计。

数据结构的选择应取决于其他各种因素:

  • 你需要存储结果吗?
  • 您是如何访问数据的?串行或随机访问?
  • 您要在哪些键上搜索数据?
  • 如果您计划并行执行任务,它是否可以处理并发写入?锁定开销会是什么?
  • ...

针对您的用例进行优化将带来更高的回报。

答案 1 :(得分:2)

使用dict比使用类更有效。您可以避免处理类的所有开销,属性访问等。更不用说,通过键访问字典中的项目是python中最有效和优化的代码之一。

但有几点需要注意:

  1. 您只能通过测试确定。
  2. 除非您知道必要,否则不要进行优化。

答案 2 :(得分:0)

这只是猜测,但我认为瓶颈可能是从os中读取文件,而不是构建列表。

话虽如此,您只需创建一个包含所有文件名的列表并将性能与构建带有文件名的对象列表进行比较即可对其进行测试。

答案 3 :(得分:0)

在您断定代码的任何特定部分是慢速部分之前,请对程序进行概要分析。它可能是你最内层的循环,但是测试这个假设,不要只是跳过它。

对于CPU绑定的负载,请尝试Pypy。

对于I / O绑定的加载,尝试缓存,或以某种方式将大量小文件聚合到较少数量的大文件中。与读取一些顺序数据相比,开放趋于缓慢。

HTH

答案 4 :(得分:0)

我不知道另一种方法是否更好。 你可以按照以下方式做到这些;

from collections import namedtuple

Mp3Model = namedtuple("Mp3Model", "path filename artist title")

它可以创建简单的 Mp3Model 类。