Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2023, 13:38   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию Быстрый поиск в списке

здравствуйте
1
Код:
# list.count(x) Возвращает количество вхождений элемента x в список
a=[1, 2, 2, 3, 3]
print(a.count(2))  # => 2
2
Код:
a=[1, 2, 2, 3, 3]
a_txt = ';'.join(a)
и потом запрашивать искомое isk в a_txt как:
";" + isk + ";"
какой из двух вариантов быстрее ???
Ципихович Эндрю вне форума Ответить с цитированием
Старый 05.12.2023, 15:59   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
import timeit

for a, num in [
    ([1, 2, 2, 3, 3], 1000000),
    ([i for i in range(100000)], 1000)
]:
    print(len(a), num)
    print(timeit.timeit('a.count(2)', number = num, globals = globals()))
    print(timeit.timeit("a_txt.count(';2;')", setup = "a_txt = ';' + ';;'.join(map(str, a)) + ';'", number = num, globals = globals()))
    print(timeit.timeit('ac[2]', setup = 'from collections import Counter; ac = Counter(a)', number = num, globals = globals()))
Если узнавать количество требуется много раз для большого списка, то через Counter быстрее.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.12.2023, 16:41   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

спасибо понятно
Ципихович Эндрю вне форума Ответить с цитированием
Старый 06.12.2023, 14:41   #4
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

BDA, Ваш код у меня выполнился с такими результатами:
5 1000000
0.15948410000055446
0.48337700000047334
0.1509033999973326
100000 1000
2.847637400001986
1.0304775000004156
0.00039679999827058055
но у меня ПК НЕ очень)), памяти норм 8ГБ, а вот проц 2 ядра, интересно, у Вас ПК помощней? если да, то резултаты отличаются в разы? а лучше выложите их, спасибо
Ципихович Эндрю вне форума Ответить с цитированием
Старый 06.12.2023, 16:34   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

По идее важно не количество ядер, а производительность одного ядра. На одном ПК с Python 3.11:
Код:
5 1000000
0.05769570008851588
0.16954959998838603
0.058246999979019165
100000 1000
0.8221883999649435
0.3746190001256764
4.910002462565899e-05
На другом ПК с Python 3.12:
Код:
5 1000000
0.029852599999912854
0.06201290000001336
0.019560099999921476
100000 1000
0.42647199999998975
0.25632949999999255
2.5400000026820635e-05
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.12.2023, 07:40   #6
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

понятно, спасибо
Ципихович Эндрю вне форума Ответить с цитированием
Старый 07.12.2023, 09:34   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

У меня (комп покупал лет пять назад):
Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz 3.00 GHz
Memory - 8,00 ГБ OS Win 10 64-bit, Python 3.10.9

Код:
5 1000000
0.08659250001073815
0.1273038999934215
0.04978139998274855
100000 1000
0.9653202000190504
0.4645111999998335
5.5599986808374524e-05
Где-то в Сети прочитал, что тесты для списков Python и динамических списков из collections показали, что до сотен элементов в структуре - различия небольшие, а при большем числе элементов - динамические структуры выигрывают, особенно, если надо выполнять такие операции, как, например, удаление.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 07.12.2023, 10:55   #8
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

хоть и говорят, что Python интерпретируемый язык много кто его компилирует различными способами, я это делаю при установленных Python 3.11 и NSIS, есть ли смысл переходить на Python 3.12? в свете того, что в посту № 5 приведены данные выполнения кода на Python 3.11 и Python 3.12, где Python 3.12 конечно же выигрывает в скорости
Ципихович Эндрю вне форума Ответить с цитированием
Старый 07.12.2023, 17:44   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Это был не пример превосходства 3.12 над 3.11, а сравнение разных CPU, причем не совсем в равных условиях. Первый замер на конфигурации Intel Core i7 6700K, Win10, Python 3.11 (и много фоновых процессов), второй на Intel Core i7 12700K, Win11, Python 3.12 (и мало фоновых процессов). Сравнение версий питона (на одном ПК) с чуть измененным кодом (чтобы заработал на втором питоне):
Код:
import timeit

for a, num in [
    ([1, 2, 2, 3, 3], 1000000),
    ([i for i in range(100000)], 1000)
]:
    print(len(a), num)
    print(timeit.timeit('a.count(2)', setup = 'a = ' + str(a), number = num))
    print(timeit.timeit("a_txt.count(';2;')", setup = 'a = ' + str(a) + "; a_txt = ';' + ';;'.join(map(str, a)) + ';'", number = num))
    print(timeit.timeit('ac[2]', setup = 'from collections import Counter; a = ' + str(a) + '; ac = Counter(a)', number = num))
Код:
Python 2.7.13
(5, 1000000)
0.0949843
0.1439129
0.0852804
(100000, 1000)
0.9893159
0.5141326
7.69999999997e-05

Python 3.11.0
5 1000000
0.09000859991647303
0.19045190000906587
0.060124600073322654
100000 1000
0.898666099878028
0.3786721001379192
4.569999873638153e-05

Python 3.12.0
5 1000000
0.07726610009558499
0.13537980010733008
0.041592900175601244
100000 1000
0.8804800999350846
0.3923327000811696
4.2499974370002747e-05
Вроде небольшой прирост ощущается (https://www.python.org/downloads/release/python-3120/ заявляется 5% прирост производительности). А разница между CPU больше похожа на двукратную.
Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
я это делаю при установленных Python 3.11 и NSIS
Насколько понимаю, NSIS просто собирает установщик, чтобы на другом ПК специально не устанавливать питон, но это никак не влияет на производительность. Чтобы повлиять на производительность, нужно рассматривать другие интерпретаторы и компиляторы, кроме стандартного CPython: Pyston, PyPy, RustPython, Jython, IronPython, ActivePython, Nuitka, Stackless Python. Но лучше начать с подбора подходящего алгоритма и структур данных под задачу.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.12.2023, 17:51   #10
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Ципихович Эндрю
Цитата:
где Python 3.12 конечно же выигрывает в скорости
Из поста следует только то, что это другой ПК
BDA
Цитата:
На другом ПК с Python 3.12:
Из фразы: "Русские женщины носят кокошники" вовсе не следует, что все женщины в кокошниках - русские.

У меня сложилось представление, что основная работа виртуальной машины Python'а - это парсинг скрипта, а выполнение многих функций из библиотек, как, например, той же collections - это сишный код, т.е. почти машинный.
По сути Python - это другой взгляд на Си
Сильно сомневаюсь, что от версии к версии заметно улучшается скорость обработки. Не исключаю, что в некоторых версиях есть улучшения, но они не носят радикальный характер.

PS: Это только моё умозрительное представление.
PSS: Ещё не подготовил до конца ответ, как увидил подтверждение от BDA
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрый поиск по listview pvotnichek Общие вопросы Delphi 2 23.02.2019 17:18
быстрый поиск по фамилии oleg866 Помощь студентам 2 18.02.2014 00:51
быстрый поиск в таблице Наталья89 Microsoft Office Excel 2 22.12.2010 22:47
Быстрый поиск в таблице k1r1ch Общие вопросы Delphi 7 07.07.2009 14:57
Быстрый поиск по индексу valerij Microsoft Office Excel 1 21.04.2008 11:04