0

我正在从 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 进行分析)

4

0 回答 0