Итераторы более эффективны, гибки и мощны, чем циклы. Пришло время научиться их использовать.
Python — популярный язык программирования для науки о данных и обработки данных благодаря богатому набору библиотек и инструментов, которые делают анализ и обработку данных простыми и увлекательными. Однако многие программисты Python по-прежнему полагаются на традиционный цикл for для перебора наборов данных, таких как списки, кортежи, словари или файлы. В этой статье мы покажем вам, почему вы должны отказаться от использования циклов for в Python и вместо этого использовать итераторы. Мы объясним, что такое итераторы, чем они отличаются от циклов for и как они могут повысить производительность и масштабируемость ваших конвейеров обработки и обработки данных.
Что такое итераторы и чем они отличаются от циклов for?
Итератор — это объект, который можно использовать для перебора итерируемого объекта, например списка, кортежа, словаря или файла. Итерируемый объект — это объект, который может возвращать итератор при передаче встроенной функции iter(). У итератора есть метод с именем next(), который возвращает следующий элемент в итерируемом объекте или вызывает исключение StopIteration, когда элементов больше нет. Вы можете использовать встроенную функцию next() для вызова метода next() итератора.
Цикл for — это управляющая структура, которая позволяет многократно выполнять блок кода для каждого элемента в итерируемом объекте. Цикл for неявно создает итератор из итерируемого объекта и вызывает его метод next(), пока не вызовет исключение StopIteration.
Вот пример того, как использовать итератор и цикл for для перебора списка чисел:
# Using an iterator numbers = [1, 2, 3, 4, 5] iterator = iter(numbers) print(next(iterator)) # 1 print(next(iterator)) # 2 print(next(iterator)) # 3 print(next(iterator)) # 4 print(next(iterator)) # 5 print(next(iterator)) # StopIteration # Using a for loop numbers = [1, 2, 3, 4, 5] for number in numbers: print(number) # 1, 2, 3, 4, 5
Как видите, итератор, и цикл for могут использоваться для перебора одного и того же списка чисел. Однако между ними есть важные отличия:
- Итератор можно использовать с любым итерируемым объектом, а не только со списками. Например, вы можете использовать итератор для перебора строки, файла, генератора или любого пользовательского объекта, реализующего методы iter() и next().
- Итератор более эффективен, чем цикл for, при переборе больших коллекций. Это связано с тем, что итератор не хранит всю коллекцию в памяти, а возвращает только один элемент за раз. Цикл for, с другой стороны, создает копию всей коллекции в памяти, прежде чем выполнять итерацию по ней.
- Итератор можно использовать для реализации более сложных шаблонов циклов, чем цикл for. Например, вы можете использовать итератор, чтобы пропустить некоторые элементы, изменить порядок итерации или объединить несколько итераторов в один.
- Итератор можно использовать для распараллеливания задач обработки данных с использованием нескольких потоков или процессов. Цикл for не может сделать это легко, потому что он требует механизмов синхронизации и блокировки, чтобы избежать повреждения данных.
Как итераторы могут улучшить ваши конвейеры обработки и обработки данных?
Теперь, когда вы знаете, что такое итераторы и чем они отличаются от циклов for, давайте посмотрим, как их можно использовать для улучшения конвейеров обработки и обработки данных. Вот несколько примеров того, как итераторы можно использовать в общих задачах науки о данных и обработки данных:
Загрузка больших наборов данных в память
Одной из наиболее распространенных проблем в науке о данных и инженерии данных является загрузка больших наборов данных в память для анализа или обработки. Например, у вас может быть CSV-файл, содержащий миллионы строк данных, которые вы хотите загрузить в pandas DataFrame. Если вы используете цикл for для чтения каждой строки из файла и добавления ее в DataFrame, у вас быстро закончится память и произойдет сбой вашей программы.
Лучший способ загрузить большие наборы данных в память — использовать итератор, который считывает из файла одну строку за раз и возвращает ее в виде кортежа или словаря. Затем вы можете использовать метод pandas.DataFrame.from_records() для создания DataFrame из итератора. Таким образом, вы загружаете в память только одну строку за раз и избегаете создания ненужных копий данных.
Вот пример того, как использовать итератор для загрузки большого файла CSV в кадр данных pandas:
# Define an iterator that reads one row at a time from the CSV file def csv_reader(filename): with open(filename) as f: reader = csv.reader(f) next(reader) # Skip the header row for row in reader: yield row # Yield each row as a tuple # Create a DataFrame from the iterator df = pd.DataFrame.from_records(csv_reader('large_file.csv'))
Применение алгоритмов машинного обучения к наборам данных
Еще одна распространенная задача в науке о данных и инженерии данных — применение алгоритмов машинного обучения к наборам данных. Например, вы можете захотеть обучить классификатор на наборе данных, содержащем объекты и метки. Если вы используете цикл for для перебора набора данных и подачи каждой выборки в классификатор, вы потратите много времени и ресурсов.
Лучший способ применить алгоритмы машинного обучения к наборам данных — использовать итератор, который разбивает набор данных на более мелкие фрагменты и передает их классификатору. Затем вы можете использовать функцию sklearn.model_selection.train_test_split(), чтобы разделить итератор на наборы для обучения и тестирования. Таким образом, вы можете обучать и тестировать свой классификатор на небольших пакетах данных и избегать загрузки всего набора данных в память.
Вот пример того, как использовать итератор для применения алгоритма машинного обучения к набору данных:
# Define an iterator that batches the dataset into smaller chunks def batch_iterator(dataset, batch_size): batch = [] for sample in dataset: batch.append(sample) if len(batch) == batch_size: yield batch # Yield each batch as a list batch = [] if batch: yield batch # Yield the last batch # Split the iterator into training and testing sets X, y = zip(*dataset) # Unzip the dataset into features and labels X_train, X_test, y_train, y_test = train_test_split( batch_iterator(X, 100), batch_iterator(y, 100), test_size=0.2 ) # Train and test a classifier on the iterator clf = LogisticRegression() clf.fit(X_train, y_train) clf.score(X_test, y_test)
Потоковые данные с датчиков или других источников
Еще одна распространенная задача в науке о данных и инженерии данных — это потоковая передача данных с датчиков или других источников. Например, вы можете захотеть собрать и проанализировать данные с датчика температуры, который отправляет показания каждую секунду. Если вы используете цикл for для повторения показаний датчиков и их обработки, вы пропустите некоторые показания или создадите резерв необработанных данных.
Лучшим способом потоковой передачи данных от датчиков или других источников является использование итератора, который получает показания датчиков по мере их поступления и выдает их по мере их обработки. Затем вы можете использовать функцию itertools.islice(), чтобы разделить итератор на более мелкие фрагменты и проанализировать их. Таким образом, вы можете обрабатывать показания датчиков в режиме реального времени и избегать потери или задержки каких-либо данных.
Вот пример того, как использовать итератор для потоковой передачи данных с датчика:
# Define an iterator that receives sensor readings as they arrive def sensor_reader(sensor): while True: reading = sensor.read() # Read the sensor reading yield reading # Yield the reading as it is processed # Slice the iterator into smaller chunks and analyze them for chunk in itertools.islice(sensor_reader(sensor), 0, None, 10): print(chunk) # Print every 10th reading print(np.mean(chunk)) # Print the mean of every 10 readings
Анализ больших наборов данных в режиме реального времени
Еще одна распространенная задача в науке о данных и инженерии данных — анализ больших наборов данных в режиме реального времени. Например, вы можете захотеть выполнить анализ тональности потока твитов, содержащих определенный хэштег. Если вы используете цикл for для перебора твитов и их анализа, вы не сможете отслеживать поступающие данные.
Лучший способ анализировать большие наборы данных в режиме реального времени — использовать итератор, который принимает твиты по мере их поступления и выдает их по мере их анализа. Затем вы можете использовать класс collections.deque() для создания скользящего окна твитов, содержащего самые последние твиты. Затем вы можете выполнить анализ настроений в скользящем окне твитов, используя любую библиотеку обработки естественного языка. Таким образом, вы можете анализировать твиты в режиме реального времени и избежать потери или задержки каких-либо данных.
Вот пример того, как использовать итератор для анализа больших наборов данных в режиме реального времени:
# Define an iterator that consumes tweets as they arrive def tweet_reader(hashtag): api = tweepy.API(auth) # Authenticate with Twitter API stream = tweepy.Stream( auth=api.auth, listener=StreamListener() ) # Create a stream listener stream.filter(track=[hashtag]) # Filter tweets by hashtag class StreamListener(tweepy.StreamListener): def on_status(self, status): tweet = status.text # Get the tweet text yield tweet # Yield the tweet as it is analyzed # Create a sliding window of tweets using deque window_size = 100 # Set the window size window = collections.deque(maxlen=window_size) # Create a deque with fixed size # Perform sentiment analysis on the sliding window of tweets using TextBlob for tweet in tweet_reader("#python"): window.append(tweet) # Append tweet to window sentiment = TextBlob(tweet).sentiment # Get the tweet sentiment print(sentiment) # Print the tweet sentiment print( np.mean([TextBlob(t).sentiment.polarity for t in window]) ) # Print the mean sentiment polarity of the window
Заключение
В этой статье мы показали вам, почему вы должны отказаться от использования циклов for в Python и вместо этого использовать итераторы. Мы объяснили, что такое итераторы, чем они отличаются от циклов for и как они могут повысить производительность и масштабируемость ваших конвейеров обработки и обработки данных. Мы также предоставили несколько примеров того, как итераторы можно использовать в общих задачах науки о данных и обработки данных, таких как загрузка больших наборов данных в память, применение алгоритмов машинного обучения к наборам данных, потоковая передача данных с датчиков или других источников и анализ больших наборов данных в реальном времени. -время.
Мы надеемся, что эта статья убедила вас попробовать итераторы и что вы узнали что-то новое и полезное. Итераторы — ключевая концепция функционального программирования, которая является популярной парадигмой для науки о данных и проектирования данных. Используя итераторы, вы можете использовать возможности функционального программирования для создания более элегантных, эффективных и масштабируемых конвейеров обработки и обработки данных.
Спасибо, что прочитали эту статью. Мы надеемся, что вам понравилось и вы нашли это полезным. Удачного кодирования! 😊
💌 Вам понравилось то, что вы прочитали? Подпишитесьсегодня, чтобы получить порцию вдохновения прямо на почту! Давайте поддерживать поток знаний вместе.