- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!