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

时间:2017-11-08 22:49:09

标签: python performance interpreted-language

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

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

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

那么我的问题是:

  

如何在python实现中处理这样的上下文更改?我可以做些什么来降低影响力   这种背景变化?

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帮助)?

1 个答案:

答案 0 :(得分:1)

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

简而言之:

功能范围是dict,在这里看不出多少优化。

更长的解释:

我知道在空间优化发挥作用时会使用named tuple。原因是,使用命名元组,所有键都相同,并保留一次。这样,您可以在代理定义中节省一些空间。但是,如果调用function,它会创建一个范围dict。这就是Python的工作原理。如何优化呢?好吧,你必须在C中写一下,以便完全控制什么,何时分配。