Рассказы о математике с примерами на языках Python и C [Дмитрий Елисеев] (fb2) читать постранично, страница - 17
Книга 383213 устарела и заменена на исправленную
[Настройки текста] [Cбросить фильтры]
20. Приложение 2 - Быстродействие языка Python
Язык Python очень удобен своей краткостью и лаконичностью, возможностью использования большого количества сторонних библиотек. Однако, один из его минусов, который может быть ключевым для математических расчетов — это быстродействие. Python это интерпретатор, он не создает exe-файл, что разумеется, сказывается на скорости выполнения программы. Рассмотрим простой пример: рассчитаем сумму квадратов чисел от 1 до 1000000. Также выведем время выполнения программы. Программа на языке Python выглядит так: import timestart_time = time.time()
s = 0 for x in range(1,1000001): s += x * x
print("Sum={}, T={}s".format(s, time.time() - start_time)) Результаты работы: Sum = 333333833333500000, T = 0.47s Учитывая, что чисел всего миллион, не так уж и быстро. Попробуем ускорить программу, для этого по возможности используем функции встроенных библиотек. Они зачастую написаны на C, и работают быстрее. import time
start_time = time.time()
l = range(1000001) s = sum(x * x for x in l)
print("Sum = {}, T = {}s".format(s, time.time() - start_time)) Результаты работы: Sum = 333333833333500000, T = 0.32s Быстрее, но лишь чуть-чуть. К тому же, данный код хранит весь массив в памяти, что неудобно. И наконец, призываем «тяжелую артиллерию»: напишем программу на языке C. Код выглядит так: #include <stdio.h> #include <time.h>
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.
Последние комментарии
10 минут 36 секунд назад
21 минут 18 секунд назад
26 минут 20 секунд назад
27 минут 30 секунд назад
29 минут 49 секунд назад
30 минут 4 секунд назад