Рассказы о математике с примерами на языках Python и C | страница 34




И наконец, призываем “тяжелую артиллерию”: напишем программу на языке C. Код выглядит так:

#include

#include


int main()

{

clock_t start = clock();


unsigned long long int sum = 0, i;

for(i=1; i<1000001; i++) {

sum += i*i;

}


clock_t end = clock();

printf("Sum = %llu, T = %fs", sum, (float)(end - start)/CLOCKS_PER_SEC);

return 0;

}


Как можно видеть, он ненамного сложнее python-версии. Перед запуском программы, ее надо скомпилировать, выполнив команду C:\GCC\bin\gcc.exe "Appendix-2 - speedTest.c" -o"Appendix-2 - speedTest". Результат очевиден: T = 0.007 секунд. И еще чуть-чуть: добавляем флаг оптимизации по скорости, выполнив команду C:\GCC\bin\gcc.exe "Appendix-2 - speedTest.c" -o"Appendix-2 - speedTest" -O3. Результат: 0.0035 секунд, разница в быстродействии более 100 раз!


Увы, в более сложных задачах такого прироста реально не бывает (в последнем примере очень короткий код, который видимо полностью помещается в кеш-памяти процессора), но на некоторое улучшение быстродействия можно рассчитывать. Хотя переписывание программы - это крайний случай, сначала целесообразно поискать стандартные библиотеки, которые возможно уже решают данную задачу. К примеру, следующий код на языке Python, вычисляет сумму элементов массива за 0.1с:

a = range(1000001)

s = 0

for x in a:

s += x

print(s)


Можно использовать встроенную функцию sum:

a = range(1000001)

s = sum(a)

print(s)


Данный код выполняется за 0.02 секунды, т.е. в 5 раз быстрее первого варианта. Но разумеется, если заранее известно, что задача состоит в обработке большого набора чисел (например поиск простых чисел или магических квадратов), то может быть более целесообразным сразу писать программу на С или С++, в принципе это не намного сложнее, а работать программа будет быстрее.


Заключение

На этом данная книга закончена, хотя надеюсь, что не навсегда - по возможности и по мере появления новых идей, новые главы будут дописываться. Автор надеется, что хоть немного удалось познакомить читателей с увлекательным миром математики и программирования.


Продолжение следует.


Обо найденных неточностях или дополнениях просьба писать на электронную почту dmitryelj@gmail.com. Наличие новой версии можно проверить на странице http://dmitryelj.spb.ru/math.htm.