2016-01-28 1 views
1

List Scaladoc говорит:Scala: Помогите мне понять производительность Список

Время: Список имеет O (1) перед именем и голова/хвост доступа.

val mainList = List(3, 2, 1) 
val with4 = 4 :: mainList // re-uses mainList, costs one :: instance 
val with42 = 42 :: mainList // also re-uses mainList, cost one :: instance 
val shorter = mainList.tail // costs nothing as it uses the same 2::1::Nil instances as mainList 

Что значит "стоит один экземпляр ::"? (Ссылка на O(1) заключается в предоставлении контекста, это не то, о чем я прошу. Мой вопрос касается высказываний комментариев).

+3

В scala рядом с '::', являющимся методом класса List, '::' также является именем класса и представляет собой единственный элемент в списке. Поэтому я думаю, что они имели в виду здесь один экземпляр этого класса. – Archeg

+0

@Archeg. Если '::' является именем класса, почему в REPL не работает следующее? 'scala> ::' ':: no такая команда. Тип: help for help.' 'scala> Nil' ' res4: scala.collection.immutable.Nil.type = List() ' –

+1

@AbhijitSarkar Попробовать' new: :(5, Nil) ' – Archeg

ответ

3

думаю есть costs one :: instance потребление памяти предназначено. Когда вы сделаете 4 :: mainList, scala создаст новый экземпляр ::. Когда вы делаете mainList.tail, scala не нужно ничего создавать.

Это очень важно, чтобы показать, потому что для всего блока

val mainList = List(3, 2, 1) 
val with4 = 4 :: mainList // re-uses mainList, costs one :: instance 
val with42 = 42 :: mainList 

Scala выдает только 5 :: экземпляров, вместо 8.

Это, безусловно, не о производительности, потому что вы не можете скажем, что mainList.tail ничего не стоит с точки зрения производительности.

+0

> Scala выпускает только 5 :: экземпляров ». если бы я понял вас правильно, вы имеете в виду следующую разбивку? (код в комментарии сосет, извините). 'val mainList = 3 :: 2 :: 1 :: Nil' (3 подсчета' :: ') ' val with4 = 4 :: mainList' (1 счет '::') 'val with42 = 42 :: mainList' (1 кол-во '::') Всего 5 номеров '::' –

+2

@AbhijitSarkar Да, это правильно. Этот код будет переведен в 'val mainList = new: :(3, new: :(2, new: :(1, Nil))); val with4 = new: :(4, mainList); val with42 = new: :(42, mainList) ', так что 5' новых' ключевых слов - так 5 распределений памяти – Archeg

+0

Имеет смысл. Также в отношении вашего утверждения «вы не можете сказать, что« mainList.tail »ничего не стоит с точки зрения производительности», как я уже цитировал, документ уже говорит, что это операция «O (1)». Так что почти ничего не стоит. –