小编use*_*473的帖子

NetworkX Graph对象的"同构"比较,而不是默认的"地址"比较

我想将NetworkX Graph对象用作Python中的键dict.但是,我不希望比较的默认行为(即,通过对象的地址).相反,我希望同构图指代是相同元素的关键dict.

这种行为是否已在某处实施?我找不到这个方向的任何信息.

如果我必须自己实施,以下评估是否现实?

  • networkx.Graph上课.
  • 定义__eq__它调用is_isomorphic.
  • __hash__以某种方式定义(欢迎建议).

我认为我必须使这个包装的Graph不可变,因为:

如果一个类定义了可变对象并实现了一个__eq__()方法,那么它就不应该实现__hash__(),因为hashable集合的实现要求一个键的哈希值是不可变的(如果对象的哈希值改变,它将在错误的哈希桶中).

python hash isomorphism networkx

5
推荐指数
1
解决办法
770
查看次数

当参数保持不变时,最大限度地减少代价高昂的函数调用次数(python)

假设有一个函数costly_function_a(x):

  1. 它的执行时间非常昂贵;
  2. 只要输入相同的输出,它就会返回相同的输出x; 和
  3. 除了返回输出之外,它不执行"附加任务".

在这些条件下,x我们可以将结果存储在临时变量中,然后使用该变量进行这些计算,而不是连续两次调用函数.

现在假设有一些功能(f(x),g(x)h(x)调用在下面的示例)costly_function_a(x),并且其中的一些功能可以调用彼此(在下面的例子中,g(x)h(x)两个呼叫f(x)).在这种情况下,使用在重复调用以上仍结果提到的简单的方法costly_function_a(x)用相同的x(见OkayVersion下文).我确实找到了一种最小化呼叫次数的方法,但它"丑陋"(见FastVersion下文).有没有更好的方法来做到这一点?

#Dummy functions representing extremely slow code.
#The goal is to call these costly functions as rarely as possible.
def costly_function_a(x):
    print("costly_function_a has been called.")
    return x #Dummy operation.
def costly_function_b(x):
    print("costly_function_b has been called.")
    return 5.*x #Dummy operation.

#Simplest (but slowest) implementation.
class SlowVersion:
    def …
Run Code Online (Sandbox Code Playgroud)

python optimization

3
推荐指数
1
解决办法
268
查看次数

标签 统计

python ×2

hash ×1

isomorphism ×1

networkx ×1

optimization ×1