2024-04-19 18:29:26 发布
网友
假设我在Python中有一个函数,它使用一个常数计算的浮点值,如1/3。
def div_by_3(x): return x * (1/3)
如果我重复调用函数,1/3的值是否会自动缓存以提高效率?或者我必须手动做一些事情,比如下面的?
你自己去找吧!dis模块非常适合检查此类内容:
>>> from dis import dis >>> def div_by_3(x): ... return x * (1/3.) ... >>> dis(div_by_3) 2 0 LOAD_FAST 0 (x) 3 LOAD_CONST 1 (1) 6 LOAD_CONST 2 (3.0) 9 BINARY_DIVIDE 10 BINARY_MULTIPLY 11 RETURN_VALUE
如您所见,1/3计算每次都会发生。(注意:我将3更改为3.以强制浮点除法,否则它将为0。您还可以启用future division,这实际上改变了行为,请参见下面的编辑部分)。在
1/3
3
3.
第二种方法是:
有关第二个的更多信息可以通过inspect函数对象找到:
>>> inspect.getargspec(db3) ArgSpec(args=['x', '_ONE_THIRD'], varargs=None, keywords=None, defaults=(0.3333333333333333,))
您可以看到默认值缓存在那里。在
EDIT:这在python3中更有趣,它们会被缓存(在python2.7中,当您启用from __future__ import division)时:
from __future__ import division
>>> dis.dis(div_by_3) 2 0 LOAD_FAST 0 (x) 3 LOAD_CONST 3 (0.3333333333333333) 6 BINARY_MULTIPLY 7 RETURN_VALUE
在python3或2.7-with-future-division中切换到整型除法(//)并没有改变这一点,它只是将常量改为0而不是{},在2.7中直接使用整数除法而不使用future division也会缓存0。在
//
0
今天学到了新东西!在
你自己去找吧!dis模块非常适合检查此类内容:
如您所见,
1/3
计算每次都会发生。(注意:我将3
更改为3.
以强制浮点除法,否则它将为0。您还可以启用future division,这实际上改变了行为,请参见下面的编辑部分)。在第二种方法是:
^{pr2}$有关第二个的更多信息可以通过inspect函数对象找到:
您可以看到默认值缓存在那里。在
EDIT:这在python3中更有趣,它们会被缓存(在python2.7中,当您启用
from __future__ import division
)时:在python3或2.7-with-future-division中切换到整型除法(},在2.7中直接使用整数除法而不使用future division也会缓存
//
)并没有改变这一点,它只是将常量改为0
而不是{0
。在今天学到了新东西!在
相关问题 更多 >
编程相关推荐