Решение которые дали товарищи выше будет читать массив очень много раз. Проще создать новый массив, при этом старый надо будет прочитать всего один раз.
arr = list(itertools.chain.from_iterable(([x] if x != 0xc0 else [0xdb, 0xdc] for x in arr)))
Здесь длина пакета (из последовательного порта) не превышает (максимум) 600-700 байт, конкретно здесь, может и не очень важно, а вообще, учту, спасибо.
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
Нужно максимально оптимальное решение — пиши на ассемблере или хотя бы на си. Нужно с большим массивом данный работать — цепляй базу данных.
А если ты пытаешься письками на питоне меряться, то твоя писька проиграла, ибо питон нужен чтобы писать красивые и легко читаемые письки, а не то, о чём ты себе фантазируешь.
И изначально этот код даже для питона был настолько неоптимален, что рассуждать об этом просто смешно.