Страницы: Пред. 1 2 3
RSS
Фильтрация по 2000 условий
 
Мое почтение, джентльмены!
Плотно поработав в выходные над логикой в парральльных потоках, убрал часть накладных расходов. Оптимизировал компаратор.
Результаты по теме:
1.Не содержит с игнорированием регистра (решение по теме) 4.5 сек.
2.Не содержит и учитываем регистр - 4.5 сек.
3.Не равно и игнорируем регистр - 3.77 сек
4.Не равно с учетом регистра -3.5 сек
5.Равно без учета регистра -3.5 сек
6.Равно с учетом регистра -3.45 сек


Прошу тестировать. Библу закинул на сайт.

Реализовал функционал LIKЕ, пока с символом "*". Тест планирую вечером, бета версию с LIKE. Тоже вечером.
«Бритва Оккама» или «Принцип Калашникова»?
 
Добрый день, Виталий!
Видно, что проделана большая работа, с учетом универсальности решения результаты очень впечатляющие!
Эти времена включают и время загрузки данных с листа Еxcel с выгрузкой на вновь созданный отдельный лист, как у Павла в #11, или с заменой исходных данных со сжатием ListObject, как  в #45?
Еще - в данных были не только текстовые, но и числовые значения, они переводились в текстовые?
Изменено: ZVI - 19.09.2022 11:23:44
 
Владимир, добрый день! Спасибо за интерес к теме и интересные вопросы. Видно, что глубоко погружались в тему и вопросы соответствующие.
Отвечаю:
Озвученное выше время - только время на фильтрацию.
4.5 сек
Общее время на загрузку данных с листа (как у Павла), расчет, создание нового листа и выгрузку 5 сек.

Если были числовые данные, они обрабатывались как числовые, в текст не переводились (т.е. в расчет не входили).
Но при выгрузке из VBA на лист, Excel сам преобразовывает текст похожий на числа в числа.

Сделал файл-пример, где задаются условия для фильтра в библиотеке (для тех, кому хочется попробовать, но непонятно, что нужно сделать).
Нужно открыть этот файл или любой другой с кодом, и открыть или установить как надстройку XLL. Нажать кнопку. Всё. Ничего сложного.

В файле-примере не полностью заполнен массив для фильтрации (не пролезал файл), заполнить самостоятельно. Массив условий заполнен полностью под задачу.

Сейчас версия библы тестовая, вечером еще внесу корректировки, внесу возможность использовать Like ...*...*.*.*...
Выложу на свой сайт, отпишусь здесь.
Изменено: bedvit - 20.09.2022 08:31:48
«Бритва Оккама» или «Принцип Калашникова»?
 
Фильтр работает с типом данных VARIANT. Можно добавить новый функционал, сделать еще универсальнее: преобразование всех данных к какому либо типу, тексту или, если возможно к числу (если тект похож на число).
Преобразование типа данных: VariantChangeType

Нужно ли это, или пользователь сам преобразует, если ему надо перед загрузкой в фильтр?
Изменено: bedvit - 19.09.2022 17:23:17
«Бритва Оккама» или «Принцип Калашникова»?
 
Добавил Like. Библиотеку залил на сайт.

P S. Результаты замеров по времени выполнения задачи по теме.
На 4 логических ядрах. Поиск подстроки 4.5 сек, like *...* - 5.25 секунды. Итого Like вполне неплохо справляется (ручная оптимизация кода)
Изменено: bedvit - 21.09.2022 09:23:24
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Нужно ли это, или пользователь сам преобразует, если ему надо перед загрузкой в фильтр?
Сделал инструменты, что бы быстро решить такого вида вопросы.
«Бритва Оккама» или «Принцип Калашникова»?
 
Таиминги на Python с использованием библиотеки BedvitCOM.dll_v3.0
Загрузка файла и данных, сек  15.294197797775269
Фильтрация ArrayFilterV, сек  4.903175354003906
Загрузка на лист Excel и сохранение файла, сек  18.162644147872925
Итого, сек  38.3600172996521

Итого основное время это открытие/сохранение файла, загрузка/выгрузка данных на лист Excel.
Изменено: bedvit - 20.10.2022 10:02:37
«Бритва Оккама» или «Принцип Калашникова»?
 
Тайминги на Python для открытого документа Excel
Загрузка данных, сек  0.43199872970581055
Фильтрация ArrayFilterV, сек  4.966533184051514
Выгрузка на лист Excel, сек  0.8736157417297363
Итого, сек  6.2721476554870605

Код
from win32com import client
import time

t1=time.time()
bCOMvba = client.DispatchEx('BedvitCOM.VBA')
ExcelApp = client.GetActiveObject("Excel.Application")
workbook = ExcelApp.ActiveWorkbook
sheet1 = workbook.sheets('Данные')
sheet2 = workbook.sheets('Стоп-слова')
sheet3 = workbook.sheets('Лист1')
# data = [(1, 'Apple', 2, 4.0), (2, 'Orange', 3, 5.0), (3, 'Peach', 5, 5.0), (4, 'Pear', 6, 5.0)]
data = list(sheet1.Range("A1:A273495").Value2)#usedrange
dataF = list(sheet2.Range("A1:F2097").Value2)

t2=time.time()
resCom=bCOMvba.ArrayFilterV(data, dataF, 0)
t3=time.time()

sheet3.Range("A:A").clear
sheet3.Range(sheet3.Cells(1,1),sheet3.Cells(len(resCom[0]),1)).Value2 = resCom[0]
t4=time.time()

print("Загрузка данных, сек ",t2-t1)
print("Фильтрация ArrayFilterV, сек ",t3-t2)
print("Выгрузка на лист Excel, сек ",t4-t3)
print("Итого, сек ",t4-t1)
Изменено: bedvit - 20.10.2022 15:45:25
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: Пред. 1 2 3
Наверх