Страницы: 1 2 3 4 След.
RSS
VBA Как сделать поиск ещё быстрее?
 
Сейчас 100раз поисков среди 10.000 слов выполняется за 2,32 сек
способ1: переменной типа Range присваивается диапазон Range ("Table1") и поиск осуществляется через обращение к этой переменной

Каким способом на порядки быстрее осуществлять поиск?
Какие-то есть специальные объекты для этого, это всё что я знаю

PS на всякий случай, может показать что 100раз поисков слова среди 10.000 слов за 2,32 сек итак быстро, но я скажу,
НАДО быстрее, потому что мои другие объёмы массивов и число поисков превышают на порядки это всё
Изменено: tod2020 - 17.08.2017 09:47:56
 
Через обычный поиск не быстрее, чем через перебор диапазона ячеек? Можно попробовать сохранить диапазон в массив и работать с ним (быстрее в разы).
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, Как загнать Range ("Table1")  в массив?
 
Код
Dim Rng
Rng = Range("Table1")
«Бритва Оккама» или «Принцип Калашникова»?
 
Макрос:
Код
Sub qq()
    Dim X_find As String, xx As Long, xx1 As Double, xx2 As Double, xx3 As Double, T
    X_find = Cells(9, 5) ' искомое слово
    xx = Cells(12, 5) ' число раз поиска
    T = Time
    a = Range("C2:C" & Cells(Rows.Count, 3).End(xlUp).Row).Value
    For j = 1 To xx
        For i = 1 To UBound(a, 1)
            If a(i, 1) = X_find Then
                m = m + 1: Exit For
            End If
        Next
    Next
    If m = 0 Then: MsgBox ("нет такого слова"): Exit Sub
    xx1 = Application.RoundUp(Time, 2)
    xx2 = Application.RoundUp(T, 5)
    xx3 = Application.RoundUp((Time - T) * 100000, 2)
    MsgBox ("найдено за " & xx3 & " сек")
End Sub
Чем шире угол зрения, тем он тупее.
 
SAS888, у тебя такая же ава как у меня
 
Цитата
tod2020 написал:
у тебя такая же ава как у меня
Да. я любитель многомерности.
А по макросу?
Изменено: SAS888 - 16.08.2017 11:32:11
Чем шире угол зрения, тем он тупее.
 
Код в #5 через массив - поэтому работает на порядки быстрее (про что я и говорил). У меня отрабатывает очень быстро.
«Бритва Оккама» или «Принцип Калашникова»?
 
SAS888, чем лучше так
Код
a = Range("C2:C" & Cells(Rows.Count, 3).End(xlUp).Row).Value

чем вот так
Код
a = Range("Table1")
 
В первом случае берется диапазон по столбцу "C" по последнее значение. Во втором вся таблица (может быть несколько столбцов).
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
tod2020 написал:
чем лучше так...
Без разницы. Скорость выполнения макроса зависит от количества обращений к ячейкам листа.
В идеале - это забрали диапазон в массив, обработали и выгрузили на лист.
Чем шире угол зрения, тем он тупее.
 
tod2020, На полное соответствии слова - в разы, а при использования InStr отличие по скорости будет варьироваться не значительно и несколько зависеть от конфиги компа.
 
Вообще отлично получилось. Спасибо всем, особенно SAS888
Обращение к массиву ровно в 20 раз быстрее чем мой первый способ

Обращение к массиву это предельный быстрый существующий способ?
или можно добиться ещё большей скорости обработки?
Изменено: tod2020 - 16.08.2017 12:07:40
 
или нет?
 
Если знать конечный вариант задачи-то можно подумать. например поиск не по всему диапазону, и т.д.
«Бритва Оккама» или «Принцип Калашникова»?
 

Код
' ==========ПОИСК ЧЕРЕЗ ОБРАЩЕНИЕ К ПЕРЕМЕННОЙ СОДЕРЖАЩЕЙ ДИАПАЗОН==========
Sub find2()
Dim xx1, xx2, xx3 As Double
Dim Rng As Range, arr(), cell
arr = Range("Table1").Value
X_find = Cells(9, 5) ' искомое слово
xx = Cells(12, 5) ' число раз поиска
T = Timevbb:
        For Each cell In arr
            If cell = X_find Then
            m = m + 1
            End If
        Next cell
If m = 0 Then: MsgBox ("нет такого слова"): Exit Sub
If m < xx Then: GoTo vbb
xx1 = Application.RoundUp(Time, 2)
xx2 = Application.RoundUp(T, 5)
xx3 = Application.RoundUp((Time - T) * 100000, 2)
MsgBox ("найдено за " & xx3 & " сек")
End Sub

Изменено: Nordheim - 16.08.2017 12:38:55
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
tod2020 написал:
или можно добиться ещё большей скорости обработки?
- можно использовать словарь, но на 100 поисков нужно ещё посмотреть что будет быстрее.
На 1000 поисков думаю быстрее будет с использованием словаря.
 
Есть словари, поиск в словаре по ключу - наверняка будет быстрее чем перебор всего массива, возможно можно сделать индексацию массива или бинарный поиск (к примеру преобразовав символы юникода в число, число должно искаться быстрее - в теории).
«Бритва Оккама» или «Принцип Калашникова»?
 
Nordheim,

Код
        For Each cell In arr
            If cell = X_find Then
            m = m + 1
            End If
        Next cell

такое же время показывает что и #5
Изменено: tod2020 - 16.08.2017 12:56:52
 
Цитата
bedvit написал:
Есть словари, поиск в словаре по ключу
что это такое?
 
tod2020, все зависит от вашей конечной задачи, поиск по отсортированному массиву значительно быстрее, к примеру пройтись Match-ом, или использовать словарь или другие способы, которые применимы к вашей конечной задаче.
«Бритва Оккама» или «Принцип Калашникова»?
 
есть какие-то ещё специальные объекты, используя которые быстрее происходит
Изменено: tod2020 - 16.08.2017 12:59:23
 
Цитата
tod2020 написал:
что это такое?
По словарям много ссылок в сети, наугад:
Объект Dictionary
Dictionary
Изменено: bedvit - 16.08.2017 13:06:22
«Бритва Оккама» или «Принцип Калашникова»?
 
Бинарный поиск по сортированному массиву будет работать существенно быстрее обычного перебора

UPD:
Сразу не увидел, но данный способ уже предложил bedvit
Изменено: MCH - 16.08.2017 13:17:59
 
?
Изменено: tod2020 - 16.08.2017 13:19:44
 

Код
' ==========ПОИСК ЧЕРЕЗ ОБРАЩЕНИЕ К ПЕРЕМЕННОЙ СОДЕРЖАЩЕЙ ДИАПАЗОН==========
Sub find2()
Dim i&, X_find$, cell, m&
Dim arr(), dic1 As Object, xx&, t As Date
Set dic1 = CreateObject("Scripting.Dictionary")
arr = Range("Table1").Value
X_find = Cells(9, 5) ' искомое слово
xx = Cells(12, 5) ' число раз поиска
t = Timer
For Each cell In arr
    dic1.Item(CStr(cell)) = 0
Next cell
For i = 1 To xx
    If dic1.exists(X_find) Then m = m + 1
Next i
Debug.Print m
If m = 0 Then: MsgBox ("нет такого слова"): Exit Sub
Debug.Print m
MsgBox Format(Timer - t, "0.000")
End Sub

Изменено: Nordheim - 16.08.2017 13:26:10
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
MCH написал:
Бинарный поиск по сортированному массиву будет работать существенно быстрее обычного перебора
как мне это сложно. как это выглядит? это строчек 7 кода надо заменить в моём варианте?
 
Доброе время суток
Цитата
tod2020 написал:
как мне это сложно. как это выглядит?
Опять бан в поисковых системах? Двоичный (бинарный) поиск элемента в массиве
Успехов.
 
Цитата
tod2020 написал:
   If dic1.exists(X_find)
не понял когда dic1 получает  данные из  Range("Table1")

Код
dic1.Item(CStr(cell)) = 0

это обнуление ячейки словаря?
Изменено: tod2020 - 16.08.2017 13:43:29
 
Цитата
MCH написал:
UPD:
Сразу не увидел, но данный способ уже предложил bedvit
Михаил, перечислил несколько :) Но пока не дождался от автора темы конечного варианта задачи. Если данные все время меняются, то индексация или сортировка каждый раз - это жирно, смотреть на словари, если статистические - сортировка массива и Match с последним аргументом 1 или -1 (интервальный просмотр), глянуть на бинарный поиск, если в поставленных рамках задачи, то можно запоминать последний найденный элемент и с него вести поиск в массиве, 100 раз - будет быстрее в разы..  и т.д.
Изменено: bedvit - 16.08.2017 13:35:58
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1 2 3 4 След.
Читают тему
Наверх