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

另一种方法称为猴子修补(在运行时替换导入的方法)。

https://stackoverflow.com/questions/62572633/

相关文章:

node.js - 如何在 Strapi 中创建不同的管理员角色

ios - UIView 作为@EnvironmentObject 的订阅者

angular-cli - 每当我运行 npm run ng build-hin 时,我都会遇到错误

javascript - Angular ngrx : TypeError: Cannot free

reactjs - 应用多个动态过滤器

vue.js - 当对象没有(可识别的)变化时触发 Vue 监视

android - 使用 Moshi 处理错误响应

javascript - 如何使用 React 在客户端裁剪图像而不丢失分辨率

rust - 我如何使字符串比闭包体生命周期更长?

flutter - 无法在 flutter 中使用wifi包连接到wifi