В Scala, как обойти неэффективный промежуточный поток TraversableLike.toIterator - PullRequest
5 голосов
/ 14 июля 2011

(Gen) TraversableOnce.toIterator переопределяется в TraversableLike как toStream.iterator, вызывая появление промежуточного потока.

В качестве простого примера, скажем, я пытаюсь реализовать простой *Утилита 1007 *, которая всегда приводит свои аргументы к итераторам перед вызовом zip, чтобы получить эффективный итератор для обеих коллекций.

Следующее неэффективно (из-за промежуточного потока):

def izip[A,B](xs: TraversableOnce[A], ys: TraversableOnce[B]) =
  xs.toIterator zip ys.toIterator

и должен быть расширен до:

def izip[A,B](xs: Iterable[A], ys: Iterable[B]) =
  xs.iterator zip ys.iterator
def izip[A,B](xs: Iterator[A], ys: Iterable[B]) =
  xs zip ys.iterator
def izip[A,B](xs: Iterable[A], ys: Iterator[B]) =
  xs.iterator zip ys
def izip[A,B](xs: Iterator[A], ys: Iterator[B]) =
  xs zip ys
// .. and more needed to handle Traversables as well

Есть ли лучший способ?

1 Ответ

2 голосов
/ 14 июля 2011

Я думаю, что черты гарантируют только существование данного метода, а не его реализацию.Они могут обеспечить реализацию по умолчанию , но подтип может переопределить ее.

Таким образом, даже если TraversableLike предоставляет реализацию для toIterator, будет использоваться фактическая реализация передаваемого вами объекта.

Если у вас есть проблемы с производительностью со стандартными коллекциями, возможно, настоящая проблема заключается вв другом месте.Если это пользовательская коллекция, вы должны переопределить toIterator разумным определением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...