python - 实现函数的优化和非优化版本的最简洁方法?

标签 python

对于一个大学项目,我想用 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/

相关文章:

python - Tensorflow Keras 保留每批的损失

python - 使用百分号向 panda 数据框添加百分比列

python - 我希望这个 Tkinter Canvas 可滚动,获取复选框的输出以选择列

python - 训练 LSTM 模型

python - 映射不解包元组

python - IOError : [Errno 13] file not accessible with Google AppEngine 1. 6.1

python - 在不预定义要使用的字符串数的情况下在 Pandas 中搜索多个字符串

python - 为什么空字典的大小与 Python 中非空字典的大小相同?

python - 名称错误 : name 'K' is not defined

python - ORM 列可以在 SQLAlchemy 中触发 session 刷新吗?