在排序列中优化pygtk / gtk TreeView交互式搜索?

时间:2014-11-05 20:48:19

标签: performance search treeview gtk pygtk

我有一个带有自定义模型的Gtk.TreeView(继承自Gtk.TreeModel),我显示~150K行。我正在使用PyGtk,但这不应该那么重要。

GUI交互没问题,但是当激活交互式搜索时,它需要永远(每个字符约10秒)。 从我对Searching a ListStore的理解和测试,交互式搜索检查ListStore的每一行(内部存储为链表)以找到值。

由于我正在搜索已排序的列,我想进行二分搜索。

我该怎么做?我是否需要从头开始重新编程交互式搜索? TreeModelSort可以有用吗? (我不明白它的内部是如何管理的)

如果我推出自己的搜索用户界面,我不知道如何开始。 草图看起来像这样:

  1. Disable built-in interactive search
  2. 创建搜索用户界面,并将其连接到正确的按键
  3. 在我自定义的数据表示中手动执行二进制搜索(如果可以随机访问,则在已排序的显示行中)
  4. 选择正确的匹配。
  5. 对于3. GtkTreeModel似乎可以随机访问行:

      

    gtk.TreeModel对象支持一些Python Mapping协议,它允许您检索表示模型中一行的gtk.TreeModelRow对象。

    是真正有效的随机访问吗?

1 个答案:

答案 0 :(得分:0)

目前尚不清楚您是如何实施自定义gtk.TreeModel的 - 是ListStore,还是您自己推出的内容?即使有150K行,也不清楚搜索列表存储需要10秒钟。

可以在ListStore上实现二进制搜索,但TreeView实现的搜索不是二进制,它只是将列表从当前位置扫描到最后,寻找匹配。它允许自定义"equals" callback,但不能自定义搜索策略。你需要的是一个更通用的搜索功能,它接受一个键并返回树中相应的位置。

要实现对大树的有效搜索,您需要按照编辑中列出的问题的方式滚动自己的搜索UI。查看现有的实现,它没有多大工作:它可以归结为显示一个顶级gtk.WINDOW_POPUP窗口,其中包含一个条目,其activate信号连接到搜索的代码并定位树光标到它找到的那一行。