Как ускорить многие операции `tf.gradients`

Если у вас есть только Iterator (в отличие от Iterable или Spliterator ), это, вероятно, не стоит распараллеливать. В Эффективная Java Джош Блох утверждает, что:

Даже в лучших обстоятельствах распараллеливание конвейера вряд ли увеличит его производительность, если источник из Stream.iterate или используется промежуточная операция limit.

У Iterator есть только метод next, который (как правило) должен вызываться последовательно. Таким образом, любая попытка распараллеливания будет делать то, что делает Stream.iterate: последовательно запускает поток, а затем отправляет данные другим потокам. Есть много накладных расходов, которые поставляются с этой передачей, и кеш не на вашей стороне вообще. Есть хороший шанс, что это не будет стоить того, за исключением, может быть, если у вас есть несколько элементов для перебора, и у вас будет много работы над каждым. В этом случае вы можете также поместить их все в ArrayList и распараллеливаться оттуда.


Это другая история, если вы можете получить разумно параллелизуемый Stream . Вы можете получить их, если у вас хорошие Iterable или Spliterator. Если у вас есть хороший Spliterator, вы можете получить Stream с помощью методов StreamSupport.stream . Любой Iterable имеет метод spliterator . Если у вас есть Collection, используйте метод parallelStream .

A Map в Java имеет пары ключ-значение, поэтому я не совсем уверен, что вы означает «помещать в HashMap». Для этого ответа я предполагаю, что вы имеете в виду, что вы делаете вызов метода put, где ключ является одним из элементов и значением Boolean.TRUE. Если вы обновите свой вопрос, я могу дать более конкретный ответ.

В этом случае ваш код может выглядеть примерно так:

public static  Map putInMap(Stream elements) {
  return elements.parallel()
      .collect(Collectors.toConcurrentMap(e -> e, e -> Boolean.TRUE, (a, b) -> Boolean.TRUE));
}
  • e -> e is ключ-ключ, создающий его так, чтобы клавишами были элементы.
  • e -> Boolean.TRUE является преобразователем значений, поэтому его значения равны true.
  • (a, b) -> Boolean.TRUE - это функция слияния, решая, как объединить два элемента в один.

0
задан Calasue 18 January 2019 в 21:41
поделиться