Как ускорить программу на Питон?
Двумерные массивы (вложенные списки)
Модуль itertools - сборник полезных итераторов.
itertools.count(start=0, step=1) - бесконечная арифметическая прогрессия с первым членом start и шагом step.
itertools.cycle(iterable) - возвращает по одному значению из последовательности, повторенной бесконечное число раз.
itertools.repeat(elem, n=Inf) - повторяет elem n раз.
itertools.accumulate(iterable) - аккумулирует суммы.
accumulate([1,2,3,4,5]) --> 1 3 6 10 15
itertools.chain(*iterables) - возвращает по одному элементу из первого итератора, потом из второго, до тех пор, пока итераторы не кончатся.
itertools.combinations(iterable, [r]) - комбинации длиной r из iterable без повторяющихся элементов.
combinations('ABCD', 2) --> AB AC AD BC BD CD
itertools.combinations_with_replacement(iterable, r) - комбинации длиной r из iterable с повторяющимися элементами.
combinations_with_replacement('ABCD', 2) --> AA AB AC AD BB BC BD CC CD DD
itertools.compress(data, selectors) - (d[0] if s[0]), (d[1] if s[1]), ...
compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F
itertools.dropwhile(func, iterable) - элементы iterable, начиная с первого, для которого func вернула ложь.
dropwhile(lambda x: x < 5, [1,4,6,4,1]) --> 6 4 1
itertools.filterfalse(func, iterable) - все элементы, для которых func возвращает ложь.
itertools.groupby(iterable, key=None) - группирует элементы по значению. Значение получается применением функции key к элементу (если аргумент key не указан, то значением является сам элемент).
>>>
>>> from itertools import groupby>>> things = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"),... ("vehicle", "speed boat"), ("vehicle", "school bus")]>>> for key, group in groupby(things, lambda x: x[0]):... for thing in group:... print("A %s is a %s." % (thing[1], key))... print()A bear is a animal. A duck is a animal. A cactus is a plant. A speed boat is a vehicle. A school bus is a vehicle.
itertools.islice(iterable[, start], stop[, step]) - итератор, состоящий из среза.
itertools.permutations(iterable, r=None) - перестановки длиной r из iterable.
itertools.product(*iterables, repeat=1) - аналог вложенных циклов.
product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
itertools.starmap(function, iterable) - применяет функцию к каждому элементу последовательности (каждый элемент распаковывается).
starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
itertools.takewhile(func, iterable) - элементы до тех пор, пока func возвращает истину.
takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
itertools.tee(iterable, n=2) - кортеж из n итераторов.
itertools.zip_longest(*iterables, fillvalue=None) - как встроенная функция zip, но берет самый длинный итератор, а более короткие дополняет fillvalue.
zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
Модуль math – один из наиважнейших в Python. Этот модуль предоставляет обширный функционал для работы с числами.
math.ceil(X) – округление до ближайшего большего числа.
math.copysign(X, Y) - возвращает число, имеющее модуль такой же, как и у числа X, а знак - как у числа Y.
math.fabs(X) - модуль X.
math.factorial(X) - факториал числа X.
math.floor(X) - округление вниз.
math.fmod(X, Y) - остаток от деления X на Y.
math.frexp(X) - возвращает мантиссу и экспоненту числа.
math.ldexp(X, I) - X * 2i. Функция, обратная функции math.frexp().
math.fsum(последовательность) - сумма всех членов последовательности. Эквивалент встроенной функции sum(), но math.fsum() более точна для чисел с плавающей точкой.
math.isfinite(X) - является ли X числом.
math.isinf(X) - является ли X бесконечностью.
math.isnan(X) - является ли X NaN (Not a Number - не число).
math.modf(X) - возвращает дробную и целую часть числа X. Оба числа имеют тот же знак, что и X.
math.trunc(X) - усекает значение X до целого.
math.exp(X) - eX.
math.expm1(X) - eX - 1. При X → 0 точнее, чем math.exp(X)-1.
math.log(X, [base]) - логарифм X по основанию base. Если base не указан, вычисляется натуральный логарифм.
math.log1p(X) - натуральный логарифм (1 + X). При X → 0 точнее, чем math.log(1+X).
math.log10(X) - логарифм X по основанию 10.
math.log2(X) - логарифм X по основанию 2. Новое в Python 3.3.
math.pow(X, Y) - XY.
math.sqrt(X) - квадратный корень из X.
math.acos(X) - арккосинус X. В радианах.
math.asin(X) - арксинус X. В радианах.
math.atan(X) - арктангенс X. В радианах.
math.atan2(Y, X) - арктангенс Y/X. В радианах. С учетом четверти, в которой находится точка (X, Y).
math.cos(X) - косинус X (X указывается в радианах).
math.sin(X) - синус X (X указывается в радианах).
math.tan(X) - тангенс X (X указывается в радианах).
math.hypot(X, Y) - вычисляет гипотенузу треугольника с катетами X и Y (math.sqrt(x * x + y * y)).
math.degrees(X) - конвертирует радианы в градусы.
math.radians(X) - конвертирует градусы в радианы.
math.cosh(X) - вычисляет гиперболический косинус.
math.sinh(X) - вычисляет гиперболический синус.
math.tanh(X) - вычисляет гиперболический тангенс.
math.acosh(X) - вычисляет обратный гиперболический косинус.
math.asinh(X) - вычисляет обратный гиперболический синус.
math.atanh(X) - вычисляет обратный гиперболический тангенс.
math.erf(X) - функция ошибок.
math.erfc(X) - дополнительная функция ошибок (1 - math.erf(X)).
math.gamma(X) - гамма-функция X.
math.lgamma(X) - натуральный логарифм гамма-функции X.
math.pi - pi = 3,1415926...
math.e - e = 2,718281...
Модуль bisect - обеспечивает поддержку списка в отсортированном порядке с помощью алгоритма деления пополам.
Набор функций:
bisect.insort(list, elem), он же bisect.insort_right(list, elem) - вставка элемента в отсортированный список, при этом elem располагается как можно правее (все элементы, равные ему, остаются слева).
bisect.insort_left(list, elem) - вставка элемента в отсортированный список, при этом elem располагается как можно левее (все элементы, равные ему, остаются справа).
bisect.bisect(list, elem), он же bisect.bisect_right(list, elem) - поиск места для вставки элемента в отсортированный список, таким образом, чтобы elem располагался как можно правее.
bisect.bisect_left(list, elem) - поиск места для вставки элемента в отсортированный список, таким образом, чтобы elem располагался как можно левее.
Для полного счастья не хватает только функции для проверки наличия элемента в отсортированном списке. К счастью, это легко решаемо.
>>>
>>> from bisect import bisect_left>>> def contains(l, elem):... index = bisect_left(l, elem)... if index < len(l):... return l[index] == elem... return False...>>> contains(list(range(1000)), -10)False >>> testlist = (1, 2, 3, 6, 8, 10, 15)>>> contains(testlist, 10)True >>> contains(testlist, 0)False >>> contains(testlist, 20)False
array.typecode - TypeCode символ, использованный при создании массива.
array.itemsize - размер в байтах одного элемента в массиве.
array.append(х) - добавление элемента в конец массива.
array.buffer_info() - кортеж (ячейка памяти, длина). Полезно для низкоуровневых операций.
array.byteswap() - изменить порядок следования байтов в каждом элементе массива. Полезно при чтении данных из файла, написанного на машине с другим порядком байтов.
array.count(х) - возвращает количество вхождений х в массив.
array.extend(iter) - добавление элементов из объекта в массив.
array.frombytes(b) - делает массив array из массива байт. Количество байт должно быть кратно размеру одного элемента в массиве.
array.fromfile(F, N) - читает N элементов из файла и добавляет их в конец массива. Файл должен быть открыт на бинарное чтение. Если доступно меньше N элементов, генерируется исключение EOFError , но элементы, которые были доступны, добавляются в массив.
array.fromlist(список) - добавление элементов из списка.
array.index(х) - номер первого вхождения x в массив.
array.insert(n, х) - включить новый пункт со значением х в массиве перед номером n. Отрицательные значения рассматриваются относительно конца массива.
array.pop(i) - удаляет i-ый элемент из массива и возвращает его. По умолчанию удаляется последний элемент.
array.remove(х) - удалить первое вхождение х из массива.
array.reverse() - обратный порядок элементов в массиве.
array.tobytes() - преобразование к байтам.
array.tofile(f) - запись массива в открытый файл.
array.tolist() - преобразование массива в список.
Вот и всё, что можно было рассказать про массивы. Они используются редко, когда нужно достичь высокой скорости работы. В остальных случаях массивы можно заменить другими типами данных: списками, кортежами, строками.
#Рух кнопки
from tkinter import *
window_w = 900
window_h = 600
x1 = 800
y1 = 500
#Functions
def move_button_down():
global x1, y1, b
if (y1 < window_h - 50):
y1 = y1 -100
x1=x1-100
if y1<=0:
y1=90
x1=x1-90
if x1<=0:
x1=90
y1=y1+190
b.place_forget()
b.place(x = x1, y = y1)#Для управления точным местом
#расположения виджета в окне или в рамке используется менеджер .place().
#Main Code
root = Tk()
size = str(window_w) + "x" + str(window_h)
root.geometry(size)
root.resizable(1, 0)
b = Button(root, text="Start", command=move_button_down)
b.place(x = x1, y =y1 )
root.mainloop()