gpt4 book ai didi

python - Python 实现如何处理函数调用期间的上下文交换?

转载 作者:行者123 更新时间:2023-11-28 18:17:55 25 4
gpt4 key购买 nike

我正在尝试在 python 中创建一个高度模块化和数据驱动的程序,我希望模块之间的调用通过一个中央代理单例,而不是每个对象都持有对它们通信的对象的引用。这样做的主要原因是我不希望对象具有关于其他模块如何工作的任何信息,以防它们在运行时切换。

目前,这个代理服务只是一个单例,它有一个包含函数名的元组列表和对拥有它的对象的引用。每当一个模块遇到一个不属于它们自己的方法的命令时,默认行为就是将它发送到这个代理服务,该代理服务会检查是否有任何人在线能够执行它。如果找到某人,代理会将函数调用转发给正确的对象,然后在收到它后将返回发送给调用者。

我遇到的问题是,每次我需要进行任何进程间通信时,我都会导致一个对象的上下文交换,这最终会不必要地膨胀我的调用堆栈。

那么我的问题是:

How are context changes such as this handled in python implementations? And what optimizations can I make to lower the impact of such context changes?

P.S.:名称代理可能有点误导,但这不是网络应用程序。整个过程在一台机器的一个进程中运行。

编辑:这里有一个更具体的例子。

class forwardToProxy:
dict = {} #this dictionary would contain the names of commands such as "deleteName"
#and a first class function bound to the part of the program currently
#responsible for executing that command.

def forward_command(command, arg):
return dispatch[command](arg)

这是我所指的代理对象的一个​​例子。这个类所做的唯一一件事就是将命令转发给当前分配给执行的程序部分。我的问题与使用这种结构的后果有关。

  • 模块对它所做的每次调用都会在内存中创建此类的新实例,直到它解析为止吗?

  • 如果一个命令被转发到一个模块,结果将转发另一个命令,并导致另一个模块转发另一个命令,这个对象的多少实例将在内存中等待最终的返回?

  • 每次我们在不同的 python 实现中进行函数调用时,内存中到底发生了什么?(请解释相同模块和外部模块调用)

  • 可以使用哪些优化来减少此类上下文更改的影响(例如,@staticmethod 会有所帮助)?

最佳答案

有趣的话题。坦率地说,Python 预计不会很快运行,但是,我观察到越来越多的需求。

简而言之:

函数作用域是一个dict,在这里看不到太多需要优化的地方。

稍微长一点的解释:

我知道named tuple当空间优化发挥作用时使用。原因是命名元组的所有键都是相同的,并且只保留一次。这样您就可以在代理定义中节省一些空间。但是,如果您调用函数,它会创建一个作用域,即 dict。这就是 Python 的工作原理。如何优化呢?好吧,您必须用 C 语言编写,才能完全控制分配的内容和时间。

关于python - Python 实现如何处理函数调用期间的上下文交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47191037/

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