Страницы: 1 2 След.
RSS
Заполнение словаря только ключами. Какой вариант лучше?
 
Здравствуйте! Уважаемые знатоки.

Объясните  пожалуйста разницу.
Есть 3 варианта  заполнение словаря только ключами
1. Tp1 = Dict(Key)
2. Dict(Key) = 0&
3  Dict.Add  key, ""

В 1 варианте  значения словаря будут Empty. Во 2 варианте значения текст "0". С точки зрения объема занимаемой памяти и скорости какой вариант лучше ? Или ссылку где почитать.
Хотя может я что-то неверно понимаю. Я только учусь работать со словарями
 
ещё заполнять Словарь можно так
Dict.Item(key) = 0&
Dict.Add Key, Item

P.S. помню лет 7-8 назад писали, что какой-то метод заполнения медленнее, какой-то быстрее, сейчас уже не помню, а тестировать лень) Сейчас придёт Jack и напомнит или потестирует ))
Изменено: New - 03.12.2021 08:21:35
 
New   Да 3 вариант  я забыл. Сейчас исправлю.
Dict.Add Key, Item
Изменено: Евгений Смирнов - 03.12.2021 08:24:53
 
2. Dict(Key) = 0& - в том числе и заменяет, а не только добавляет, а этим уже нужно пользоваться осторожно.
По вопросам из тем форума, личку не читаю.
 
БМВ  
Цитата
в том числе и заменяет,
Про это я уже прочитал Спасибо.
 
Цитата
написал:
Во 2 варианте значения текст "0".
какой текст? Там будет число 0 типа Long. И если ничего не путаю - такой вариант заполнения наиболее быстрый. Но со своими косяками, как написано выше. Правда, в данном случае конкретно тем, что при данном заполнении идет замена Item, можно смело пренебречь, т.к. Item Вы использовать не планируете.
Изменено: Дмитрий(The_Prist) Щербаков - 03.12.2021 09:09:33
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков Спасибо. Понял
А если туда писать тип данных Boolean или Byte. будет меньше занимать памяти?
Изменено: Евгений Смирнов - 03.12.2021 09:19:34
 
Цитата
написал:
будет меньше занимать памяти?
Конечно будет. Byte - 1 байт памяти занимает, Boolean - 2, Long - 4. Но скорость не факт, что вырастет. На вскидку сейчас не скажу какой из типов будет инициализироваться быстрее, но Byte в данном случае должен быть самым быстрым по сути.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков Спасибо за разъяснения
А в 1 варианте значение Empty те это тип данных Variant  и соответственно 16 байт памяти?
 
можно поиграться с настройками

Код
Sub TestDict()
    Dim Dict As Object, arr, i As Long, tempVal As Variant, t As Single
    
    ReDim arr(1 To 500000) 'кол-во элементов в массиве
    For i = 1 To UBound(arr)
        arr(i) = "ABC" & Int(Rnd * 100000)
    Next i
     
    'var 1
    Set Dict = CreateObject("Scripting.Dictionary")
    t = Timer
    For i = 1 To UBound(arr)
        If Not Dict.exists(arr(i)) Then Dict(arr(i)) = 0&
    Next i
    Debug.Print "Var 1: ", Timer - t
    
    'var 2
    Set Dict = CreateObject("Scripting.Dictionary")
    t = Timer
    For i = 1 To UBound(arr)
        If Not Dict.exists(arr(i)) Then tempVal = Dict(arr(i))
    Next i
    Debug.Print "Var 2: ", Timer - t
        
    'var 3
    Set Dict = CreateObject("Scripting.Dictionary")
    t = Timer
    For i = 1 To UBound(arr)
        If Not Dict.exists(arr(i)) Then Dict.Item(arr(i)) = 0&
    Next i
    Debug.Print "Var 3: ", Timer - t
    
    'var 4
    Set Dict = CreateObject("Scripting.Dictionary")
    t = Timer
    For i = 1 To UBound(arr)
        If Not Dict.exists(arr(i)) Then Dict.Add arr(i), 0&
    Next i
    Debug.Print "Var 4: ", Timer - t
    
End Sub
Изменено: New - 03.12.2021 10:55:14
 
Ку-ку, ребзя  ;)
Цитата
New: Сейчас придёт Jack и напомнит или потестирует
что ж, если Евгений Смирнов не хочет или не может тестировать, то я готов —заодно и сам до конца разберусь
Файл, код и итоги
Справка
Тэги для поиска: словари, тесты, справка, описание

Цитата
Евгений Смирнов: А если туда писать тип данных Boolean или Byte. будет меньше занимать памяти?
сочуствую, если подобное крохоборство памяти действительно имеет для вас значение  :D
А так могу сказать, что VBA любит Long, хотя разницу вы вряд ли заметите  :)
Изменено: Jack Famous - 03.12.2021 15:27:06
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
New Тест 1 и 2 вариант почти одинаково
Интересно что с Item хуже чем без него
Изменено: Евгений Смирнов - 03.12.2021 10:07:17
 
В функцию формирования массива ключей добавил параметр для генерации половины дублей
Теперь, если тестировать с дублями, способ присвоения x=dic(x) работает чуть шустрее
Файл и Код
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous Спасибо. У меня тоже чаше всего 1 вариант чуть быстрее, чем второй. Но во 2 варианте не надо дописывать после 0 тип данных Long.&.
Одно только не понял. Дмитрий Щербаков уже не захотел отвечать на вопрос в сообщении 9. В 1 варианте памяти будет больше занято, чем во 2 варианте?
 
Я бы сказал так - если хотите увеличить скорость работы Dictionary - делайте раннее связывание (меню Tools - Preferences... - Microsoft Scripting Runtime) и вместо
Код
Dim Dict As Object
Set Dict = CreateObject("Scripting.Dictionary")

пишите это
Код
Dim Dict As New Dictionary

Вот тогда чувствуется ускорение процентов на 20-25% быстрее
Изменено: New - 03.12.2021 19:00:32
 
Цитата
Евгений Смирнов: В 1 варианте памяти будет больше занято, чем во 2 варианте?
в первом в качестве значений будет Empty, во втором нули
Если разница в занимаемой памяти и есть, то вы её никогда не заметите

Цитата
Евгений Смирнов: Во 2 варианте значения текст "0"
с чего взяли? Что положили, то и будет. Если просто 0, то Integer (см. мои тесты)

И кто вас научил писать & после чисел? Зачем это, хоспади?)
Изменено: Jack Famous - 03.12.2021 19:03:53
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Евгений Смирнов написал:
В 1 варианте памяти будет больше занято, чем во 2 варианте?
Длямассивовданных любого типа требуются 20 байтов памяти плюс 4 байта на каждую размерность массива, плюс количество байтов, занимаемых самими данными. Память, занимаемая данными, может быть вычислена путем умножения количества элементов данных на размер каждого элемента.
Изменено: _Igor_61 - 03.12.2021 19:01:20
 
Jack Famous Спасибо за разъяснения. Насчет раннего связывания я знал и проверил на тесте.
Цитата
И кто вас научил писать & после чисел? Зачем это, хоспади?)
Это меня сегодня NEW учил в теме Разбор листа по книгам по 2-м фильтрам и сохранение
Изменено: Евгений Смирнов - 04.12.2021 04:34:41
 
вот сразу New крайний ))
P.S. А меня разные KL и ZVI учили )) но искать, что было 10 лет назад лень )
Изменено: New - 03.12.2021 19:13:51
 
Так а в чем смысл, если своими словами?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
New  
Цитата
вот сразу New крайний ))
Я же не сказал что вы крайний. Я просто рассекретил учителей.
Учителей должны знать в лицо
Изменено: Евгений Смирнов - 03.12.2021 19:18:39
 
помню смутно (может кто ещё из старожил вспомнит), было что-то, что VBA может неверно трактовать это число (или конвертировать)... Блин, где все люди, которые были на форуме хотя бы с 2010 года? где СЛЭН? Казанский, AINT, nerv, Hugo и прочие? KL и ZVI вообще забыли про нас (( один МСH остался)
меня не было всего года с 2016, а все куда-то разбежались
Изменено: New - 03.12.2021 19:30:47
 
Цитата
New написал:
А меня разные KL и ZVI учили )) но искать, что было 10 лет назад лень )
Учиться у Владимира (ZVI) и сейчас вполне актуально. Всегда узнаешь что-то интересное даже в знакомом материале.
Игорь (Hugo) периодически появляется, Казанский, к величайшему сожалению, нет.
Изменено: sokol92 - 03.12.2021 19:30:10
Владимир
 
New  ZVI заходит на сайт. Последний раз 30.11.21 Видимо нет интересных тем
sokol92 Здравствуйте Владимир
Изменено: Евгений Смирнов - 03.12.2021 19:29:00
 
Здравствуйте, коллеги!
Владимир
 
и KL (Кирилл Лапин, MVP по Excel как и ZVI) тоже не заходит больше к нам ((
 
sokol92 А я еще ученик, до коллеги не вырос
 
начал искать запись 0& у себя в записях - очень много это используется при вызовах WinAPI функций, там где идёт значение параметра 0, практически везде стоит 0&
 
Я эти суффиксы за 25 лет не могу запомнить, поэтому вместо 0& пишу CLng(0).  :D  
Владимир
 
sokol92 Я немного пишу но основные запомнил и использую % & $
У меня уже 23.00 скоро пора домой идти
До свидания всем
Изменено: Евгений Смирнов - 03.12.2021 19:47:41
Страницы: 1 2 След.
Наверх