スカラーの並列シーケンスにcontainsメソッドがないのはなぜですか?
List.range(0,100).contains(2)
仕事、一方で
List.range(0,100).par.contains(2)
がいないのはなぜ?
今後これが予定されていますか?
スカラーの並列シーケンスにcontainsメソッドがないのはなぜですか?
List.range(0,100).contains(2)
仕事、一方で
List.range(0,100).par.contains(2)
がいないのはなぜ?
今後これが予定されていますか?
非teleological答えは、contains
がSeqLike
に定義されていますが、ParSeqLike
に定義されていないためです。
それはあなたの好奇心を満たしていない場合、あなたはSeqLike
のcontains
がこのように定義されていることを見つけることができます:
def contains(elem: Any): Boolean = exists (_ == elem)
だからあなたたとえば、あなたが
List.range(0,100).par.exists(_ == 2)
ParSeqLike
を書くことができますがありません(indexOfSlice
など)、あまり明白ではないものがいくつかあります(例:combinations
- 小規模なデータセットでのみ有効です)。 、私は完全に推測している...ライブラリの設計者はそれを左理由については
List.range(0,100).par.seq.contains(2)
を:あなたは、並列コレクションを持っている場合しかし、あなたはまた、線形のバージョンに戻って取得するために.seq
を使用し、戻ってあなたの方法を得ることができますおそらく単純化のためにメソッドの数を減らしたいと思っていたかもしれませんし、exists
を使うのと同じくらい簡単です。
これはまた、なぜcontains
がSeqLike
ではなく、あなたがexists
を見つけるすべてのコレクションの祖父、GenTraversableOnce
、上で定義された質問を、提起しますか?考えられる理由は、Map
のcontains
が、Set
とSeq
の場合と意味的に異なる方法です。 Map[A,B]
はTraversable[(A,B)]
であるため、Traversable
に対してcontains
が定義されている場合、contains
はタプル(A,B)
引数を取る必要があります。 Map
のcontains
は、A
引数をとるだけです。これを考えると、私はcontains
をGenSeqLike
に定義する必要があります - これは修正される見込みです。
(パラレルコレクションでターゲットを見つけた後でどこを検索するのがリニアバージョンよりも効率が悪いので、並列シーケンスにはcontains
がないと考えました(さまざまなスレッドは多くの不必要な作業を行います値が見つかった後:this questionを参照してください)、exists
が存在するため、これは正しいとは限りません。
'indexOfSlice'は並列配列に順序があるので意味があります。注文。しかし、効率的でスケーラブルな 'indexOfSlice'はまだ実装されていません。 – axel22
@ axel22ありがとう、更新しました。 –
ありがとう非常に役立ちます!私は、あなたがそれを期待しているように機能しない、つまりある値を見つけるとすぐに戻るため、まだ実装していないと思います。 – placeybordeaux