【问题标题】:How to optimize following function in python?如何在python中优化以下功能?
【发布时间】:2023-03-20 10:46:02
【问题描述】:

我的功能现在需要 15 分钟到 20 分钟才能运行。我在算法中多次使用它,目前是算法。因耗时而无法使用。有没有可以优化以下功能:

def find_all():
    for x in range(4, 10):
        for y in range(4, 10):
            for z in range(4, 10):
                for z1 in range(4, 10):
                    for z2 in range(4, 10):
                        for xs in range(13 - x):
                            for ys in range(13 - y):
                                for zs in range(13 - z):
                                    for z1s in range(13 - z1):
                                        for z2s in range(13 - z2):
                                            a = np.zeros(12, int)
                                            a[xs:xs+x] += 1
                                            a[ys:ys+y] += 1
                                            a[zs:zs+z] += 1
                                            a[z1s:z1s+z] += 1
                                            a[z2s:z2s+z] += 1
                                        if 0 not in a:
                                            yield x, y, z,z1,z2s,xs, ys,zs,z1s,z2s,a

%time list(find_all())

基本上我在这里要做的是建立一个没有零的列表。我确实尝试了以下解决方案,但它仅适用于两个范围,我有一个要求,我可能需要多达 6 个范围 How to generate every combination of a given pattern in numpy array?

【问题讨论】:

  • 您能解释一下它在做什么吗?您打算创建什么模式
  • 您正在执行类似 1 亿次迭代的操作(我不确定如何计算确切的迭代次数,因为内部循环中的外部变量值具有依赖性)。如果你真的需要这么多操作,那将需要很长时间。
  • 不要显得粗鲁,但这可能会在 Stack Exchange 的“代码审查”站点上得到更快的回答,该站点主要用于优化您在此处的工作代码。 Stack Overflow 更多的是帮助修复非工作代码。

标签: python numpy for-loop optimization


【解决方案1】:

在所有范围内使用itertools.product 可以更轻松地生成索引值。这将减少编码开销。

接下来,请注意您有一个 非常 规则的重叠范围序列。您应该能够导出最小的区间覆盖,而不是煞费苦心地从每个组中重新计算它。在执行通过增量计算值的过程之前,请先检查是否涵盖了所有元素。

请注意,五对参数是完全可以互换的。如果您不再浪费时间寻找等效的解决方案,您可以减少 大量 的搜索。

这会让你感动吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多