gpt4 book ai didi

python - 使用 cython 在图上执行框覆盖

转载 作者:太空宇宙 更新时间:2023-11-03 17:20:57 26 4
gpt4 key购买 nike

我编写了一个 python 脚本来在图上执行框覆盖,但当我在小图(100 个节点)上运行它时,需要一分钟多的时间。今天有人推荐cython来提高效率所以我关注了this guide调整我的代码。

运行 python 代码的结果如下:

In [6]: %timeit test.test()
1000 loops, best of 3: 1.88 ms per loop

按照指南进行操作后,结果是:

In [7]: %timeit c_test.test()
1000 loops, best of 3: 1.05 ms per loop

性能更好,但我确信还有很多可以改进的地方。鉴于我今天刚认识 cython,我想问你如何改进这段代码:

import random as rnd
import numpy as np

cimport cython
cimport numpy as np

DTYPE = np.int
ctypedef np.int_t DTYPE_t


def choose_color(not_valid_colors, valid_colors):
possible_values = list(valid_colors - not_valid_colors)

if possible_values:
return rnd.choice(possible_values)
else:
return max(valid_colors.union(not_valid_colors)) + 1


@cython.boundscheck(False)
cdef np.ndarray[DTYPE_t, ndim=2] greedy_coloring(np.ndarray[DTYPE_t, ndim=2] distances, int num_nodes, int diameter):
cdef int i, lb, j
cdef np.ndarray[DTYPE_t, ndim=2] c = np.empty((num_nodes+1, diameter+2), dtype=DTYPE)

c.fill(-1)
# Matrix C will not use the 0 column and 0 row to
# let the algorithm look very similar to the paper
# pseudo-code

nodes = list(range(1, num_nodes+1))
rnd.shuffle(nodes)

c[nodes[0], :] = 0

# Algorithm
for i in nodes[1:]:
for lb in range(2, diameter+1):
not_valid_colors = set()
valid_colors = set()

for j in nodes[:i]:

if distances[i-1, j-1] >= lb:
not_valid_colors.add(c[j, lb])
else:
valid_colors.add(c[j, lb])

c[i, lb] = choose_color(not_valid_colors, valid_colors)

return c


def test():
distances = np.matrix('0 3 2 4 1 1; \
3 0 1 1 3 2; \
2 1 0 2 2 1; \
4 1 2 0 4 3; \
1 3 2 4 0 1; \
1 2 1 3 1 0')

c = greedy_coloring(distances, 6, 4)

最佳答案

在 Cython 中,当您在 Cython 函数中删除更多 Python 调用时,您将获得更快的速度。

例如,浏览一下代码,您会在 greedy_coloring() 的嵌套循环内调用 choose_color()。也应该与函数内定义的变量一起键入。由于会被重复调用,所以会带来很大的开销。

您可以使用 cython-a 选项(例如 cython -a file.pyx)来生成带注释的 html 文件,其中显示直观地显示代码的哪一部分正在进行 Python 调用(黄线)。这将对您改进 Cython 代码有很大帮助。

很抱歉缺乏具体的指导 - 希望这有帮助。

关于python - 使用 cython 在图上执行框覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33160102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com