Инструкция по установке и настройке python 3

Использование NumPy

NumPy – это сторонняя библиотека Python. Если вы собираетесь ее использовать, сначала вам нужно убедиться в том, что она установлена.

Как это сделать при помощи REPL:

Python

import numpy

1 importnumpy

Если вы получите ошибку , то вам нужно провести установку numpy. Чтобы сделать это, перейдите в командную строку и введите:

Python

pip install numpy

1 pip install numpy

После установки, внесите следующее:

Python

import numpy as np

np.arange(0.3, 1.6, 0.3)

1
2
3

importnumpy asnp

np.arange(0.3,1.6,0.3)

Результат:

Python

array()

1 array(0.3,0.6,0.9,1.2,1.5)

Если вы хотите вывести каждое число на свою строку, вы можете сделать следующее:

Python

import numpy as np

for i in np.arange(0.3, 1.6, 0.3):
print(i)

1
2
3
4

importnumpy asnp

foriinnp.arange(0.3,1.6,0.3)

print(i)

Выдача будет следующей:

Python

0.3
0.6
0.8999999999999999
1.2
1.5

1
2
3
4
5

0.3
0.6
0.8999999999999999
1.2
1.5

Но откуда взялось число 0.8999999999999999?

У компьютеров есть проблемы с сохранением десятичных чисел с запятой в двоичные числа с запятой. Это приводит к разным неожиданным представлениям этих чисел.

Так или иначе, эти ошибки связанные с плавающей запятой являются проблемой, в зависимости от того, над какой задачей вы работаете. Ошибки могут быть выражены в виде, например, шестнадцатеричного десятичного числа, что не является критичной проблемой, в большинстве случаев. Они настолько маленькие, что, если вы только не работаете над расчетами орбитальной траектории спутников, вам не стоит беспокоиться.

В качестве альтернативы, вы можете использовать np.linspace(). Он делает в целом то же самое, но с использованием других параметров. С np.linspace() вы определяете начало и конец (оба включительно), а также длину и массив (за исключением шага).

Например, np.linspace(1, 4, 20) выдает 20 одинаково разделенных чисел: .0, …, 4.0. В другом случае, np.linspace(0, 0.5, 51) задает 0.00, 0.01, 0.02, 0.03, …, 0.49, 0.50.

Да это сбивает с толку

Когда люди говорят об итераторах (iterators) и итерируемых объектах (iterables) в Python, вы, вероятно, слышите, как кто-то повторяет неправильное представление о том, что range является итератором. Поначалу эта ошибка может показаться несущественной, но я думаю, что на самом деле она довольно критична. Если вы считаете, что range объекты являются итераторами, ваши представления о работе итераторов в Python не верны. И range, и итераторы в некотором смысле «ленивы», но они ленивы по-разному.В этой статье я собираюсь объяснить, как работают итераторы, как работает range, и как отличается лень этих двух типов «ленивых итераций».

Но сначала я хотел бы попросить вас не использовать приведенную ниже информацию в качестве предлога, чтобы быть высокомерным с кем либо, будь то новые ученики или опытные программисты в Python. Многие люди продуктивно используют Python в течение многих лет, не понимая в полной мере различие, которое я собираюсь объяснить. Вы можете написать много тысяч строк кода Python, не имея четкого представления как работают итераторы. И в этом нет ничего предосудительного.

Простые циклы

Давайте для начала рассмотрим в действии обычные циклы Python.

Используем чистый Python

Начнем с двух списков по тысяче элементов в каждом. Целочисленная переменная равна длине этих списков. Списки и получены путем случайного выбора из списка .

n = 1_000
x, y = random.sample(r, n), random.sample(r, n)

Давайте посмотрим, сколько времени потребуется для получения списка , элементов которого являются суммами соответствующих элементов списков и .

%%timeit
i, z = 0, []
while i < n:
    z.append(x + y)
    i += 1

В результате получим:

Заметим также, что результат выполнения команды зависит от многих факторов и может при каждом запуске быть разным.

Цикл должен быть лучше оптимизированным для подобных операций, так как был создан, чтобы перебирать коллекции, итераторы и генераторы. Давайте посмотрим, так ли это.

%%timeit
z = []
for i in range(n):
    z.append(x + y)

Результатом будет:

В данном случае цикл не только работает быстрее, но и выглядит гораздо лучше, чем цикл .

Представления списков в языке Python очень похожи на обычные циклы и весьма удобны в простых ситуациях. Они имеют более компактный код и обычно чуть-чуть быстрее обычных циклов.

%%timeit
z =  + y for i in range(n)]

В результате получим:

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

Использование библиотеки NumPy

NumPy — это сторонняя библиотека, которая очень часто используется в численных вычислениях. Она особенно удобна для операций с массивами (для этого в ней есть множество полезных функций). Также она позволяет писать простой и элегантный код без использования циклов.

На самом деле циклы, равно как и другие критичные для производительности операции, реализованы в NumPy на системном уровне. Именно это и позволяет функциям NumPy быть быстрее обычных функций языка Python. Еще одним преимуществом является то, как Numpy обрабатывает переменные и типы.

Давайте для начала создадим из списков целого типа Python и массивы NumPy типа integer 64-bit (целочисленный 64-х битный тип числа).

x_, y_ = np.array(x, dtype=np.int64), np.array(y, dtype=np.int64)

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

%%timeit
z = x_ + y_

Результат будет следующий:

Это почти в 85 раз быстрее, чем при использовании представления списков! И код крайне прост и красив. При работе с большими данными массивы NumPy — это самый лучший выбор. Причем, чем больше данных, тем больше выигрыш во времени.

И это не все. Если нам подходит 32-х битный целочисленный тип данных вместо 64-х битного, мы можем еще сэкономить не только память, но и время.

Точно так же теперь складываем два массива:

%%timeit
z = x_ + y_

И результат будет следующий:

Результаты с большими ( и ) приведены в таблице в конце статьи. Они иллюстрируют ту же зависимость, причем выигрыш в производительности NumPy при росте тоже увеличивается.

Создание спискового включения

Давайте сохраним его как функцию, которую мы будем вызывать. Нам нужно только упростить тело функции

Так как списковое включение создает списки, а списки могут быть назначены к переменным, примем это во внимание и расположим списковое включение справа от  и продолжим

Python

doubled =

1 doubled=thing forthing inlist_of_things

Хорошо, теперь нам нужно заполнить правую сторону. Как и с нормальным циклом for, а правая часть списка выглядит именно так, нам нужно назвать элементы в нашем цикле. Сначала, назовем каждый объект, и мы также будем использовать переменную списка, которая будет передана.

Python

doubled =

1 doubled=thing fornum inlst

Это не может работать в полной мере, так как элемент не является… элементом. В нашей изначальной функции мы выполнили , так что давайте сделаем это еще раз.

Python

doubled =

1 doubled=num*2fornum inlst

Все что находится перед циклом точно внесено в список. Наконец, нам нужно вернуть наш новый список.

Python

def list_doubler(lst):
doubled =
return doubled

1
2
3

deflist_doubler(lst)

doubled=num*2fornum inlst

returndoubled

Запускаем нашу новую функцию.

Python

my_doubled_list = list_doubler()

1 my_doubled_list=list_doubler(12,4,202)

И да, содержит ожидаемые значения , и . Отлично, все работает! Но так как мы создаем и моментально возвращаем переменную, давайте просто применим списковое включение напрямую.

Python

def list_doubler(lst):
return

1
2

deflist_doubler(lst)

returnnum*2fornum inlst

The range() Function

range()

The range() function returns a sequence of numbers, starting from 0 by default, and increments by 1 (by default), and ends at a specified number.

Using the range() function:

for x in range(6):
 
print(x)

Note that range(6) is not the values of 0 to 6, but the values 0 to 5.

The range() function defaults to 0 as a starting value, however it is possible to specify the starting value by adding a parameter: range(2, 6), which
means values from 2 to 6 (but not including 6):

Using the start parameter:

for x in range(2, 6):
 
print(x)

The range() function defaults to increment the sequence by 1,
however it is possible to specify the increment value by adding a third parameter: range(2, 30, 3):

while true или бесконечный цикл

В большинстве случаев, бесконечные циклы появляются из-за логических ошибок программиста (например, когда условие цикла при любых вариантах равно ). Поэтому следует внимательно следить за условием, при котором цикл будет завершаться.

Однако вы некоторых случая бесконечный цикл делают намерено:

  1. Если нужно производить какие-то действия с интервалом, и выходить из цикла лишь в том случае, когда внутри тела «зашито» условие выхода.
    Пример: функция, которая возвращает базы данных. Если связь с базой данных отсутствует, соединение будет пытаться (в цикле) установиться до тех пор, пока не установится.
  2. Если вы пишете полноценный демон, который продолжительное время висит как процесс в системе и периодически производит какие-то действия. В таком случае остановкой цикла будет прерывание работы программы. Пример: скрипт, который раз в 10 минут «пингует» IP адреса и пишет в лог отчет о доступности этих адресов.

Совет: в бесконечных циклах рекомендуется ставить таймаут выполнения после каждой итерации, иначе вы очень сильно нагрузите

Код был прерван комбинацией клавиш + . Иначе цикл продолжался бы бесконечно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *