LINUX.ORG.RU

Ответ на: комментарий от CaHbl4

Спасибо

Про

arr[index:index+1] = [0xdb, 0xdc]

я еще не знал.

braboar ★★
() автор топика
Ответ на: комментарий от CaHbl4

Не while True, a while oxc0 in arr
И тогда весь этот говнокод становится читаемым, хотя всё-равно нихера не эффективным:

while oxc0 in arr:
    i = arr.index(0xc0)
    arr[i:i+1] = [0xdb, 0xdc]

Goury ★★★★★
()
list(bytearray(arr).replace(b'\xc0', b'\xdb\xdc'))
MyTrooName ★★★★★
()

Решение которые дали товарищи выше будет читать массив очень много раз. Проще создать новый массив, при этом старый надо будет прочитать всего один раз.

arr = list(itertools.chain.from_iterable(([x] if x != 0xc0 else [0xdb, 0xdc] for x in arr)))

При большом массиве разницу заметишь

gnunixon ★★★
()
[y for x in arr for y in ([0xdb, 0xdc] if x == 0xc0 else [x])]
Crocodoom ★★★★★
()
Ответ на: комментарий от gnunixon

Здесь длина пакета (из последовательного порта) не превышает (максимум) 600-700 байт, конкретно здесь, может и не очень важно, а вообще, учту, спасибо.

braboar ★★
() автор топика

Всем спасибо!

Все советы учту, всем еще раз спасибо!

braboar ★★
() автор топика
import random
import time
import copy
import itertools


def one(arr):
    while True:
        try:
            index = arr.index(0xc0)
        except ValueError:
            break
        arr[index:index + 1] = [0xdb, 0xdc]


def two(arr):
    while 0xc0 in arr:
        i = arr.index(0xc0)
        arr[i:i + 1] = [0xdb, 0xdc]


def three(arr):
    _ = list(bytearray(arr).replace(b'\xc0', b'\xdb\xdc'))


def four(arr):
    _ = list(itertools.chain.from_iterable(([x] if x != 0xc0 else [0xdb, 0xdc] for x in arr)))


def five(arr):
    _ = [y for x in arr for y in ([0xdb, 0xdc] if x == 0xc0 else [x])]


def tester(func, arrays):
    data = copy.deepcopy(arrays)
    f_time = time.perf_counter()
    for t in data:
        func(t)
    f_time = time.perf_counter() - f_time
    print('{}: {} all , {} avg'.format(func.__name__, f_time, f_time / len(data)))


def replacing(arr):
    for _ in range(42):
        replace = random.randrange(0, len(arr) - 1)
        arr[replace] = 0xc0
    return arr


ARRAYS = [replacing([0x00] * 700) for _ in range(1000)]

for target in [one, two, three, four, five]:
    tester(target, ARRAYS)


one: 0.15705346298085873 all , 0.00015705346298085874 avg
two: 0.27669713546053387 all , 0.00027669713546053386 avg
three: 0.01288283625756903 all , 1.2882836257569031e-05 avg
four: 0.06660237115778456 all , 6.660237115778456e-05 avg
five: 0.055863672834307154 all , 5.586367283430715e-05 avg

KillTheCat ★★★★★
()
Ответ на: комментарий от dumdum

Нужно максимально оптимальное решение — пиши на ассемблере или хотя бы на си.
Нужно с большим массивом данный работать — цепляй базу данных.

А если ты пытаешься письками на питоне меряться, то твоя писька проиграла, ибо питон нужен чтобы писать красивые и легко читаемые письки, а не то, о чём ты себе фантазируешь.

И изначально этот код даже для питона был настолько неоптимален, что рассуждать об этом просто смешно.

Goury ★★★★★
()
Последнее исправление: Goury (всего исправлений: 1)
Ответ на: комментарий от Goury

питон нужен чтобы писать красивые и легко читаемые письки

Так и запишем.

Читаемость - это для красоты, а выполнять работу дважды, IMHO, некрасиво.

dumdum
()
Ответ на: комментарий от dumdum

Я смотрю в школах про комплексность алгоритмов вообще нихера не преподают сейчас.

Последний раз для идиотов: комплексность алгоритма не изменилась, но уровень вложенности сократился в полтора раза.

Goury ★★★★★
()
Ответ на: комментарий от Goury

Я смотрю в школах про комплексность алгоритмов вообще нихера не преподают сейчас.

У нас пытались.

для идиотов

Спасибо за заботу и уважение дорогой друг. А мне вообще плевать на сложность, у меня чисто эстетическая придирка.

dumdum
()
Ответ на: комментарий от dumdum

Хотя теперь я уже похоже передумал и ваш код стал мне казаться всё же красивее исходного.

dumdum
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.