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 函数?的主要内容,如果未能解决你的问题,请参考以下文章
实时时间序列数据中的峰值信号检测Matlab R Golang Python Swift Groovy C ++ C ++ Rust Scala Kotlin Ruby Fortran Julia C
fortran 中的combinations_with_replacement 函数?