提高嵌套 for 循环的速度

Increasing the speed of nested for loops

我目前正在尝试解决工作中的问题,所以很抱歉,代码可能会有点模糊,但概念很简单,我应该能够传达我的问题而不用担心具体。

最终目标是取两个变量 (X, Y),我需要 运行 X 对每个 Y。我提供的样本数据(甚至一半都不到)是 X = 107 和 Y = 6400,所以我们只为示例数据查看 684,800 次迭代。这显然需要一段时间,但我想尽可能缩短时间。

我尝试了两种不同的方法,一种是嵌套 for 循环,一种是我尝试 运行 并行处理它,但老实说,我对并行性没有太多经验,所以我可以看看为什么它不起作用。这两种情况 运行 在我遇到与手头问题无关的错误之前的相同时间长度(3.5 小时)

我已经尝试了几种不同的方法来使用我无法开始工作的 ParameterizedTest 在两个 CSV 中加载,所以如果有使用 JUnit 的简单方法,我很想听听。我目前正在使用 JUnit 5.3.1。

尝试 1:

@Test
void test() {
    List<String> varX = loadCsv(path);
    List<String> varY = loadCsv(otherPath);

    for (String x : varX) {
        for (String y : varY) {
            // Do the work
        }
    }
}

尝试 2:

@Test
void test() {
    List<String> varX = loadCsv(path);
    List<String> varY = loadCsv(otherPath);

    varX.parallelStream().forEach(x -> {
        for (String x : varX) {
            for (String y : varY) {
                // Do the work
            }
        }
    }
}

关于使用 @ParameterizedTest - 您可以加载两个 CSV,将它们映射到 Stream<Arguments> 并参数化测试方法以使用它们:

public static Stream<Arguments> loadTestData() {
    List<String> varX = loadCsv(path);
    List<String> varY = loadCsv(otherPath);

    return varX.parallelStream()
               .flatMap(x -> varY.parallelStream().map(y -> Arguments.of(x, y)));
}

@ParameterizedTest
@MethodSource("loadTestData")
void test(String x, String y) {
    // You now have a combination of x and y:
    // test that the logic under test works for that combination
}