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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2021, 02:02   #21
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
в том-то и дело что НЕ одно и тоже
Тогда я не понимаю проблемы. Только !слово+! является заменой, а !слово! не является?

Я думал, что findall и sub будут заметно дольше, чем split и join, но разница очень маленькая.
Код:
import timeit

print(timeit.timeit("""
txt = '!1! !2! !3! !4! !5! !6! !7! !8! !9!'
txt_parts = txt.split('!')
repls = [repl for i, repl in enumerate(txt_parts) if i % 2]
v = []
i = 0b100101011
for j, s in enumerate(txt_parts):
    if j % 2 == 0 or (i >> (j // 2)) & 1:
        v.append(s)
s = ''.join(v).strip()
#print(s)""",
    number = 100000
))

print(timeit.timeit("""
import re
txt = '!1! !2! !3! !4! !5! !6! !7! !8! !9!'
repls = re.findall(r'!.*?!', txt)
i = '3+5+7+8'
re_sub = ''
for y in i.split('+'):
    re_sub = re_sub + repls[int(y) - 1] + '|'
s = re.sub(re_sub[:-1], '', txt).strip()
#print(s)""",
    number = 100000
))
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.02.2021, 18:18   #22
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
>>
насколько удобно этим пользоваться, учитывая, что это:
>> Сдвиг вправо Сдвигает биты числа вправо на заданное число позиций. 11 >> 1 даст 5. В двоичном виде 11 представляется как 1011, что будучи смещённым на 1 бит вправо, даёт 101, а это, в свою очередь, не что иное как десятичное 5
понятно, что это уже наверное на подсознательном уровне...
??
Ципихович Эндрю вне форума Ответить с цитированием
Старый 08.02.2021, 06:11   #23
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Ну да, в си привык к битовым операциям, поэтому удобнее. На самом деле всегда есть, что улучшить. Можно сделать код более лаконичным и коротким, сократить время выполнения, минимизировать затрачиваемую память. Например, четыре чуть отличных реализации:
Код:
import timeit

tests = [
"""import re
txt = '!1! !2! !3! !4! !5! !6! !7! !8! !9!'
repls = re.findall(r'!.*?!', txt)
i = '3+5+7+8'
re_sub = ''
for y in i.split('+'):
    re_sub = re_sub + repls[int(y) - 1] + '|'
s = re.sub(re_sub[:-1], '', txt).strip()""",

"""txt = '!1! !2! !3! !4! !5! !6! !7! !8! !9!'
txt_parts = txt.split('!')
repls = [repl for i, repl in enumerate(txt_parts) if i % 2]
v = []
i = 0b100101011
for j, s in enumerate(txt_parts):
    if j % 2 == 0 or (i >> (j // 2)) & 1:
        v.append(s)
s = ''.join(v).strip()""",

"""import re
txt = '!1! !2! !3! !4! !5! !6! !7! !8! !9!'
repls = re.findall(r'!.*?!', txt)
s = re.sub('|'.join(repls[y - 1] for y in [3, 5, 7, 8]), '', txt).strip()""",

"""import re
txt = '!1! !2! !3! !4! !5! !6! !7! !8! !9!'
repls = re.findall(r'!.*?!', txt)
i = [3, 5, 7, 8]
re_sub = ''
for y in i:
    re_sub = re_sub + repls[y - 1] + '|'
s = re.sub(re_sub[:-1], '', txt).strip()"""
]

for test in tests:
    print(timeit.timeit(test, number = 100000))
На 3 питоне самый быстрый вариант - последний, а на 2 питоне - второй (на моем компьютере, по крайней мере). Самый лаконичный вариант - третий. А вот пища для размышлений о количестве используемой памяти (разный способ хранения варианта замены):
Цитата:
>>> a='1+2+3'
>>> getsizeof(a)
38
>>> b=[1,2,3]
>>> getsizeof(b)
88
>>> c=7
>>> getsizeof(c)
24
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.02.2021, 13:59   #24
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
txtrepl_all = txtrepl_all + txtrepl + ';'
ну и ещё мои накопители изменю на массив
Ципихович Эндрю вне форума Ответить с цитированием
Старый 09.02.2021, 20:06   #25
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию

я в Вашу функцию variants так толком и не вник, как подправить, чтобы не было ошибки
prev = variants(n - 1)
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
это когда нет замен вообще
и до строки кода которая предупреждает об этом код не доходит, так как ошибка возникает раньше, спс
Ципихович Эндрю вне форума Ответить с цитированием
Старый 09.02.2021, 21:41   #26
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Может быть лучше сначала проверять количество замен, а потом уже вызывать variants? Так как она работает только с положительным количеством замен. Можно изменить mem = {1: [1], 0: [], -1: []}. Можно добавить в саму функцию:
Код:
def variants(n):
    if n <= 0:
        return []
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.02.2021, 10:02   #27
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию

OK, спасибо
Ципихович Эндрю вне форума Ответить с цитированием
Старый 03.03.2021, 16:37   #28
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию

BDA, в курсе про import itertools
у Вас функция
Код:
def variants(n):
на выходе выдавала
Код:
res.append(f'{i}+{n}')  # => [1, 2, '1+2']
можете переделать, вроде побыстрее и менее строк кода, есть пример:
Код:
import itertools
s = "12"
for item in itertools.product(s, repeat=len(s)):
    print(''.join(item))
Ципихович Эндрю вне форума Ответить с цитированием
Старый 04.03.2021, 00:47   #29
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Более быстрый вариант получился такой:
Код:
def variants(n):
    s = [str(i + 1) for i in range(n)]
    return list(itertools.chain(*[["+".join(j) for j in itertools.combinations(s, i + 1)] for i in range(n)]))
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 04.03.2021 в 00:59.
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести слова предложения в таком порядке, чтобы последняя буква каждого слова совпадала с первой буквой следующего слова ( java ) huhu Помощь студентам 0 06.04.2012 19:42
Обязательные и необязательные вопросы Rusl92 PHP 2 27.06.2011 14:04
Необязательные параметры в процедуре. Alex Cones Общие вопросы Delphi 19 30.07.2010 20:57
Разбить текст на слова и произвести поиск каждого слова по текстовому массиву Burning_brook Microsoft Office Excel 2 22.05.2010 01:56
Необязательные параметры метода -как? boris-blade Общие вопросы .NET 2 24.03.2010 03:42