2

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

4

5 回答 5

5

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

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

  • 你需要存储结果吗?
  • 您如何访问数据?串行访问还是随机访问?
  • 您将在哪些键上搜索数据?
  • 如果您打算并行化您的任务,它可以处理并发写入吗?锁定开销是多少?
  • ...

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

于 2012-08-16T15:23:33.293 回答
2

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

不过有几点需要注意:

  1. 只有通过测试才能确定。
  2. 除非您知道有必要,否则不要优化。
于 2012-08-16T15:19:33.903 回答
0

这只是一个猜测,但我相信瓶颈可能在于从操作系统读取文件,而不是构建列表。

话虽如此,您可以简单地通过创建一个包含所有文件名的列表并将性能与构建一个包含文件名的对象列表进行比较来测试它。

于 2012-08-16T15:17:09.037 回答
0

在您断定代码的任何特定部分都是慢速部分之前,请先分析程序。这可能是你最里面的循环,但测试这个假设,不要只是跳到它。

对于受 CPU 限制的负载,请尝试 Pypy。

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

高温高压

于 2012-08-16T21:23:36.020 回答
0

不知道有没有更好的方法。您可以按以下方式执行这些操作;

from collections import namedtuple

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

它可以创建简单的Mp3Model类。

于 2012-08-17T14:22:17.953 回答