Python中的常量计算是否被缓存?

2024-04-19 18:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我在Python中有一个函数,它使用一个常数计算的浮点值,如1/3。

def div_by_3(x):
    return x * (1/3)

如果我重复调用函数,1/3的值是否会自动缓存以提高效率?或者我必须手动做一些事情,比如下面的?

^{pr2}$

Tags: 函数divbyreturndef常数手动事情
1条回答
网友
1楼 · 发布于 2024-04-19 18:29:26

你自己去找吧!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,这实际上改变了行为,请参见下面的编辑部分)。在

第二种方法是:

^{pr2}$

有关第二个的更多信息可以通过inspect函数对象找到:

>>> inspect.getargspec(db3)
ArgSpec(args=['x', '_ONE_THIRD'], varargs=None, keywords=None, defaults=(0.3333333333333333,))

您可以看到默认值缓存在那里。在

EDIT:这在python3中更有趣,它们会被缓存(在python2.7中,当您启用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。在

今天学到了新东西!在

相关问题 更多 >