我正在从 CSV 加载数据结构。最终的结构是由项目对象组成的几个集合类,每个对象都有一个或两个属性,这些属性指向其他集合中的子级或父级。
这不是很多数据。CSV 为 800KB。目前从 CSV 加载数据结构大约需要3.5 秒。最初,我有一些O(n^2)
代码被完全执行的包含查找破坏了n^2
,但我添加了一些索引并真正减少了它。
现在我的弱点仍然是包含查找,但是是线性的。当您的程序中最耗时的组件是重复执行以下代码时,这是令人沮丧的:
def add_thing(thing):
if thing not in things:
things.append(thing)
我可能遗漏了一些东西(我希望我是!),但似乎我无能为力来加快这些速度。我不希望things
集合thing
多次包含相同的内容。为此,我必须检查已经存在的每一个项目。也许有更快list
的方法可以为我做到这一点?基于 C 的、无重复的list
?
无论如何,我想我会腌制得到的数据结构,看看它需要多长时间load
。诚然,我不知道 unpickling 会发生什么,但我的想法是 unpickling 必须更接近原始 I/O,因为数据结构本身已经在 pickle 中布局。我惊讶地发现pickle.load
这个数据结构需要2.4 秒。只比我的 CSV slop 快 30%。cPickle 在0.4 seconds 内完成了同样的工作,但我正试图尽可能地做到这一点,但我意识到我可能已经失败了。但我希望你能看到我的思路,批评它的弱点。
那么,如果有的话,我应该从练习中收集什么?
- 性能
pickle.load
和我的 CSV 加载代码彼此无关,我不应该比较它们吗? - 像这样的事情需要很长时间?
- 我可以进一步优化我的收容查找吗?
- 我都搞错了?
(注意我正在使用 cProfile 进行分析)