Собственно как сделать и желательно чтобы быстро работало. Пример того что хочется получить (8-битные числа складываем):
В том же условном C++ такое можно получить, например, так:
#include <iostream>
using namespace std;
int main()
{
unsigned char a=250;
unsigned char b=25;
unsigned char c=a+b;
cout << int(c) << endl;
return 0;
}
По идее это должно аппаратно быстро выполняться, а в питоне приходит на ум только такая дикая конструкция:
a = 250
b = 25
if a+b > 255:
c = b-256+a
else:
c = a+b
print(c)
Однако, по идее такой кодец будет тормозить, когда надо будет считать такие числа в огромных количествах (скажем 20 000 000). Как пример, на моей машине код
#include <iostream>
using namespace std;
int main()
{
unsigned char a=250;
unsigned char b=25;
unsigned char c;
for(int i=0; i<20000000;i++){
c=a+b;
a=c;
}
cout << int(c) << endl;
return 0;
}
Выполняется 0m0.122s
Если увеличить в 100 раз, то 0m6.534s, из чего можно предположить что полной оптимизации с предварительным расчетом всего цикла не происходит. Однако, с питоном всё не просто плохо, а ужасно:
a = 250
b = 25
i = 0
c = 0
while i < 20000000:
if a + b > 255:
c = b - (256 - a)
else:
c = a + b
a = c
i = i+1
print(c)
Выполняется целых 0m4.120s
Ждать времени выполнения расчета для 2млрд чисел у меня честно даже нет желания, т.к. по грубым прикидкам это будет 6 минут. Итого питон грубо говоря тормозит в 20 раз, что не есть хорошо. Конечно, я понимаю, что питон медленный, т.к. интерпретируемый, но что-то мне подсказывает что if в данном случае помогает ему быть медленней в пару раз. Как можно оптимизировать код на питоне?