提高嵌套 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
}
我目前正在尝试解决工作中的问题,所以很抱歉,代码可能会有点模糊,但概念很简单,我应该能够传达我的问题而不用担心具体。
最终目标是取两个变量 (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
}