Лекция Быстрый питон.ppt
- Количество слайдов: 16
Быстрый Python Или нет. . . Лектор: Смирнов Павел Математический лагерь СЛОН
Инициализация и заполнение массива/списка import random a = [] for i in xrange(0, 10000): a. append(random. randint(0, 1000)) 42 мс #include <iostream> #include <ctime> #include <cstdlib> using namespace std; int main() { int arr[10000]; srand(time(0)); for (int i = 0; i < 10000; i++) { arr[i] = rand() % 1001; } return 0; } import random a = [random. randint(0, 1000) for i in xrange(10000)] 41 мс 3 мс
Сортировка. import random a = [] for i in xrange(0, 10000): a. append(random. randint(0, 1000)) for i in xrange(0, len(a) - 1): for j in xrange(0, len(a) - i - 1): if a[j] < a[j + 1]: a[j], a[j + 1] = a[j + 1], a[j] 16904 мс #include <iostream> #include <ctime> #include <cstdlib> using namespace std; int main() { int n = 10000; int arr[n]; srand(time(0)); for (int i = 0; i < n; i++) { arr[i] = rand() % 1001; } for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i -1; j++) { if (arr[j] < arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } 411 мс
Встроенные функции сортировки import random a = [] #include <iostream> #include <ctime> #include <cstdlib> using namespace std; for i in xrange(0, 10000): a. append(random. randint(0, 1000)) int compare (const void * x 1, const void * x 2) { return ( *(int*)x 1 - *(int*)x 2); a. sort() } 45 мс int main() { int n = 10000; int arr[n]; srand(time(0)); for (int i = 0; i < n; i++) { arr[i] = rand() % 1001; } qsort(arr, n , sizeof(int), compare); return 0; } 6 мс
«The Computer Language Benchmarks Game»
Улучшаем свой код Задача из projecteuler. net Найти самый большой палиндром, который является произведением двух трехзначных чисел. Итак, не вдаваясь в исследование математических свойств палиндромов, выполним решение задачки в лоб. Алгоритм примерно такой: 1) Цикл по числам от 100 до 999. 2) Внутренний цикл по числам от 100 до 999. 3) Если произведение переменных итерации внешнего и внутреннего цикла - палиндром и он больше предыдущего найденного - запоминаем его. 4) Получаем результат.
Улучшаем свой код def is_palindrome(number): return str(number) == str(number)[: : -1] MIN = 100 MAX = 1000 Ответ: 906609 Время выполнения: 632 мс def largest(): max_number = 0 for i in range(MIN, MAX): for j in range(MIN, MAX): if is_palindrome(i*j) and i*j > max_number:
Улучшаем свой код def is_palindrome(number): return str(number) == str(number)[: : -1] MIN = 100 MAX = 1000 Ответ: 906609 Время выполнения: 111 мс def largest(): max_number = 0 for i in range(MIN, MAX): for j in range(MIN, MAX): if i*j > max_number and is_palindrome(i*j):
Улучшаем свой код def is_palindrome(number): return str(number) == str(number)[: : -1] Ответ: 906609 MIN = 100 MAX = 1000 Время выполнения: 78 мс def largest(): max_number = 0 for i in range(MAX - 1, MIN -1, -1): for j in range(MAX -1, MIN -1, -1): if i*j > max_number and is_palindrome(i*j):
Улучшаем свой код def is_palindrome(number): return str(number) == str(number)[: : -1] Ответ: 906609 MIN = 100 MAX = 1000 Время выполнения: 44 мс def largest(): max_number = 0 for i in range(MAX - 1, MIN - 1, -1): for j in range(MAX -1, i - 1, -1): if i * j > max_number and is_palindrome(i * j):
Влияние лишних print. def is_palindrome(number): Ответ: 906609 return str(number) == str(number)[: : -1] Время выполнения в MIN = 100 MAX = 1000 def largest(): max_number = 0 for i in range(MAX - 1, MIN - 1, -1): for j in range(MAX -1, i - 1, -1): print (i * j) IDLE: 1192575 мс Почти 20 минут. НО Если перенаправить вывод в файл: 179 мс Вывод в консоль: 5932 мс
Быстрые конструкции val = 0 i = 0 while i < 1000000: 116 мс val += i i += 1 from functools import reduce(lambda res, x: res+x, range(1000000)) 141 мс val = 0 for i in range(1000000): 80 мс val += i val = 0 for i in xrange(1000000): 42 mc val += i
Быстрые конструкции for i in xrange(1000000): 74 мс if 10 < 10. 0: pass for i in xrange(1000000): 56 мс If 10. 0 < 10. 0: pass for i in xrange(1000000): 35 мс if 10 < 10: pass
Быстрые конструкции for i in xrange(1000000): 140 мс float(10) for i in xrange(1000000): 144 мс Int(10. 0) for i in xrange(1000000): 32 мс 10 + 0. 0
Быстрые конструкции a = [] 44825 мс for i in xrange(100000): a = a + [i] a = [] 156 мс for i in xrange(1000000): a += [i] a = [0] * 1000000 81 мс for i in xrange(1000000): a[i] = i a = [] 91 мс for i in xrange(1000000): a. append(i) A = range(1000000) 39 мс a = [i for i in xrange(1000000)] 50 мс
Другие способы ускорения Pyc Декоратор cpmoptimaze Cpython Pypy Psyco
Лекция Быстрый питон.ppt