Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 4, 2013 20:34:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

сокращение последовательности в строке, re

добавил твой к временным тестам, заменив генератор на список

#!/usr/bin/env python3
 
class NotAListError(TypeError):
    pass
 
def convert_any_order(lst):
    if type(lst) != list:
        raise NotAListError('the argument should be a list')
    lst.sort()
    lst.append(None)
    NOTSEQ, SEQ = 0, 1
    prev_state = NOTSEQ
    itr = iter(lst)
    item = next(itr)
    out = []
    for nextitem in itr:
        state = SEQ if (nextitem is not None and nextitem - item == 1) else NOTSEQ
        if state == SEQ:
            if prev_state == NOTSEQ:
                seq_start = item
        elif state == NOTSEQ:
            if prev_state == SEQ:
                out.append(str(seq_start) + ':' + str(item))
            elif prev_state == NOTSEQ:
                out.append(str(item))
        prev_state, item = state, nextitem
    return out

[guest@localhost timecmp]$ ./timecmp.py 
[0.6980701190004766, 0.6938450420002482, 0.6918122200004291]
[0.6967832520003867, 0.7003876839999066, 0.7101401099998839]
[0.7023664429998462, 0.703262595000524, 0.7029014090003329]
[0.6880042000002504, 0.6855810509996445, 0.6881532290008181]
[0.9738981830005287, 0.9772623899998507, 0.9726100779998887]
[guest@localhost timecmp]$

1) со срезом
2) со срезом через itertools
3) без среза
4) через iter()
5) твой



Офлайн

#2 Ноя. 4, 2013 21:18:39

bismigalis
Зарегистрирован: 2010-10-02
Сообщения: 449
Репутация: +  47  -
Профиль   Отправить e-mail  

сокращение последовательности в строке, re

это я думаю из-за лишней проверки

а как ты таймишь? хочу по-оптимизировать

Офлайн

#3 Ноя. 4, 2013 21:41:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

сокращение последовательности в строке, re

#!/usr/bin/env python3
 
import timeit
import onegrp1, onegrp2, onegrp3, onegrp4, onegrp5
 
def f1():
    onegrp1.convert_any_order([1, 2, 3, 1, 2, 3, -1, -2, -3] * 10)
 
def f2():
    onegrp2.convert_any_order([1, 2, 3, 1, 2, 3, -1, -2, -3] * 10)
 
def f3():
    onegrp3.convert_any_order([1, 2, 3, 1, 2, 3, -1, -2, -3] * 10)
 
def f4():
    onegrp4.convert_any_order([1, 2, 3, 1, 2, 3, -1, -2, -3] * 10)
 
def f5():
    onegrp5.convert_any_order([1, 2, 3, 1, 2, 3, -1, -2, -3] * 10)
 
t1 = timeit.Timer('f1()', 'from __main__ import f1')
t2 = timeit.Timer('f2()', 'from __main__ import f2')
t3 = timeit.Timer('f3()', 'from __main__ import f3')
t4 = timeit.Timer('f4()', 'from __main__ import f4')
t5 = timeit.Timer('f5()', 'from __main__ import f5')
 
for t in t1, t2, t3, t4, t5:
    print(t.repeat(3, 10000))



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version