如何动态改变包中计算的浮点精度?

问题描述 投票:0回答:1

我正在用 python 编写一个包,它使用不同的库(numpy、numexp、pyfftw)执行许多数组操作。它由多个实用程序脚本和一个解析 .ini 文件并运行特定模拟的模拟脚本组成。我想选择对给定模拟运行的所有计算强制执行的精度(在 .ini 文件中)。

我想知道是否可以按照以下逻辑实现它(代码不起作用):

#config.py
DTYPE = 'float64'

#utility.py
import numpy as np
from config import DTYPE

def create_array():
    print(DTYPE)
    arr = np.ones(10, dtype=DTYPE)
    return arr

#simulation.py
from config import DTYPE
from utility import create_array

if __name__ == '__main__':
    print(DTYPE)
    precision = get_precision(ini_file)
    DTYPE = precision
    create_array()

如果精度是“float32”,我希望看到以下输出:

'float64'
'float32'

我见过[这个问题](https://github.com/numpy/numpy/issues/6860)。这是一个很好的解决方法,但由于我使用了多个库,猴子修补(

np.array -> np.array(..., dtype=DTYPE)
)似乎并不理想,我想改变模拟之间的精度。

我知道我的代码不起作用,因为常量

DTYPE
在导入时加载并在运行时修改。

python numpy package floating-point
1个回答
0
投票

问题是

from config import DTYPE
的行为与您期望的不同:它没有为您提供指向
DTYPE
中的
config.py
变量的指针,它实际上是创建它的副本。所以
DTYPE
in
config.py
、in
utility.py
和 in
simulation.py
是三个独立的变量,改变其中一个不会影响其他变量。

但是,如果您导入该模块,那么它会按照您想要的方式运行:

simulation.py

from config import DTYPE
from utility import create_array
import utility

if __name__ == '__main__':
    print(DTYPE)
    precision = get_precision(ini_file)
    utility.DTYPE = precision
    create_array()

关键是

utility.DTYPE = precision
,它会更改
DTYPE
模块中的
utility
变量,
create_array()
会看到并使用该变量。

如此处所示,这有点笨拙,您可能需要删除导入

DTYPE
的所有其他行并稍微清理一下代码,但访问
module.variable
是修改此共享变量的方法。

这不是很好的封装,您正在有效地更改全局,但这应该可以按要求解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.