fortran 中的combinations_with_replacement 函数?

Posted

技术标签:

【中文标题】fortran 中的combinations_with_replacement 函数?【英文标题】:A combinations_with_replacement function in fortran? 【发布时间】:2011-10-26 17:27:23 【问题描述】:

我在 python 中编写了一个小模块,以获取适合y 总成本的x 产品的所有可能性。该模块运行良好,但速度很慢。计算六个产品大约需要六个小时,每个产品最多迭代 30 次。所以,我正在考虑用 FORTRAN 重写脚本,看看我能不能挤出一些更好的速度。不幸的是,我是 FORTRAN 的新手,现在大多数图书馆都不是这样。

在 FORTRAN 中是否有与 python 的 itertools.combinations_with_replacement(pool, r) 类似的模块/功能,或者完成相同事情的模块?

【问题讨论】:

【参考方案1】:

不要那样做。当您需要进行算法优化时,您正在尝试进行微优化。这就是为什么我基于 itertools 争论你 should not use the exponential-time solution,但是 better, recursive solution。

【讨论】:

我同意回溯。如果您真的不需要查看所有可能的替换组合,那么值得避免。此外,CPython 的 combination_with_replacent 是用 C 语言编写的,因此您不会通过在 Fortran 中重写该部分来加快速度(尽管您可以通过为每个组合执行的操作来加快速度)。 确实,先生,您是对的。谢谢你让我直截了当。您是否知道如何计算所需的迭代次数?即使使用你的方法,我仍然需要很长时间。分钟而不是小时,但仍然值得一个进度条。 我认为您的下一步是退后一步,想想您将结果用于什么目的。如果您不必拥有所有可能性,则可能还有进一步优化的空间。此外,可以通过将其转换为生成器来改进我的示例实现。 (这很简单,但我将把它作为练习留给读者。)【参考方案2】:

FWIW,itertools documentation 有一个纯 python 等价于 combine_with_replacement()。很简洁,翻译成 Fortran 应该不难

def combinations_with_replacement(iterable, r):
    # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC
    pool = tuple(iterable)
    n = len(pool)
    if not n and r:
        return
    indices = [0] * r
    yield tuple(pool[i] for i in indices)
    while True:
        for i in reversed(range(r)):
            if indices[i] != n - 1:
                break
        else:
            return
        indices[i:] = [indices[i] + 1] * (r - i)
        yield tuple(pool[i] for i in indices)

【讨论】:

谢谢,我正在看那个。我只是不想重写***。 ;-P

以上是关于fortran 中的combinations_with_replacement 函数?的主要内容,如果未能解决你的问题,请参考以下文章

Fortran 中的变量识别问题

Fortran 2008 中的函数重载

对 FORTRAN 中的种类感到困惑

如何在fortran中的特定行写入

Matlab 与 Julia 与 Fortran 中的速度

确定内存中的 Fortran 派生类型大小