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

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

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

【问题讨论】:

    标签: python fortran combinatorics itertools


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2015-01-13
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多