对于一个大学项目,我想用 python 实现一些代码。稍后,它的一部分应该替换为对 native CUDA 代码的调用。
现在,我正在考虑在我的模块中放置一个模块范围的开关 OPTIMIZED
。
def set_optimized(b):
# possible check for CUDA device first
OPTIMIZED = b
def my_fun(arg1, arg2):
if OPTIMIZED:
# some c-calls here
return retval
else:
# some python code here
return retval
这个实现有一些不错的特性:
- 测试用例可以轻松比较优化和未优化版本的结果和性能。
- 对于每一个优化的函数都有一个非优化的备份。例如,在没有 CUDA 设备的机器上,我禁止切换到优化版本,程序仍然运行而无需更改代码。
另一种选择是将所有函数实现为 class NonOpt
的方法。可以使用 class Opt(NonOpt)
中的优化版本覆盖这些函数。
感觉这个选项的样板代码更少,但有一个缺点:实例化和使用类的算法必须知道底层的 opt/nonopt 版本。
有没有规范的方法来做到这一点?或者这是一个坏主意,我忽略了一些基本的东西?
旁注:对我来说,这个问题很笼统。过去我曾无意中遇到过这个问题,当时我想在 Julia 中维护优化和未优化的代码。每当我不得不更改数学时,我可以简单地更改易于阅读的非优化版本。测试用例会告诉我,我是否在更复杂的优化版本中获得了相同的结果。
最佳答案
将另一个选项添加到您的列表并可能“隔离”您的函数是在导入期间使用 if
语句。取决于您的风格,只需确保它们以相同的名称结束并包含相同的函数名称即可。
if OPTIMIZED:
from optimized import mymodule
else:
from non_optimized import mymodule
另一种方法称为猴子修补(在运行时替换导入的方法)。
关于python - 实现函数的优化和非优化版本的最简洁方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62572633/