【问题标题】:Speeding up sampling in a graph加快图中的采样速度
【发布时间】:2023-03-24 18:36:01
【问题描述】:

我最近一直在使用 Python 进行图形采样。我的工作示例如下:

for enx, wlen in enumerate(wlen_dist):
    for j in range(wlen):
        node_container = queue.Queue(maxsize=200000000)
        node_container.put(node_name)
        tmp_walk = [] # [node_name]
        while not node_container.empty():
            nod = node_container.get()
            neighs = list(network.neighbors(nod))
            tar = random.choice(neighs)
            node_container.put(tar)
            if len(tmp_walk) > enx+1:
                break
            tmp_walk.append(tar)
       some_container.append(tmp_walk)

其中 wlen 是长度为 enx 的路径的样本数,我只是将步行保存到 some_container(这里并不重要)。 wlen_dist 例如:

[1000,500,100]

在这里,获得了 1000 个长度为 2 的步行样本、500 个长度为 3 和 100 个长度为 4 的样本。 networkx 是一个 networkX 图。 我想知道,如何加速这样的代码(我是这部分的新手)。

我的想法:

  1. 使用 Numba 并将各个步道包装到一个方法中

  2. 以某种方式使用 Cython

  3. 用 C++ 全部重写并以某种方式调用它

如果有任何想法和反馈,我会很高兴,谢谢!

【问题讨论】:

  • 线程是加速它的一种简单方法,因为您有一个可以并行完成的任务列表。
  • 您是否考虑过将较长步行的部分重复用于较短的步行?例如。一个 3 步的随机游走包括两个 2 步的随机游走?
  • 谢谢,你的意思是某种形式的缓存吧?这是个好主意,谢谢!
  • 忘记了,另一个对我有用的关于使用networkx加速我的python代码的想法是PyPy(不需要更改你的代码)

标签: python graph networkx numba


【解决方案1】:

图嵌入中经常使用的一个想法是重用部分随机游走的想法:

如果您有一个随机游走访问节点a_1, a_2, a_3,您可以将其视为一次长度为 3 的随机游走和两次长度为 2 的随机游走(a_1, a_2a_2, a_3)。

这可以推广到更长的游走,因此长度为 4 的随机游走包含 2 个长度为 3 的随机游走和 3 个长度为 2 的随机游走。

【讨论】:

  • 谢谢,我目前正在努力实现这个想法,它似乎是最好的(最佳)解决方案
猜你喜欢
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多