Вы можете попробовать использовать мой модуль mailer .
from mailer import Mailer
from mailer import Message
message = Message(From="me@example.com",
To="you@example.com")
message.Subject = "An HTML Email"
message.Html = """Hi!
How are you?
Here is the link you wanted.
"""
sender = Mailer('smtp.example.com')
sender.send(message)
Чтобы понять, что не так с этим кодом, мы в первую очередь переходим к рефакторингу:
Настроить этот класс необходимо для симуляции среднего сообщения от вашего Kafka.
class Message:
"""Class to simulate expected Kafka message."""
def __init__(self):
self.value = "10,20,30,40".encode()
Настройте этот генератор для имитации правдоподобного сообщения от Kafka.
import random
import time
def message_generator(n):
"""Yield a generated Kafka message."""
for i in range(n):
time.sleep(random.uniform(0, 0.001))
yield Message()
Прежде чем перейти к любому рассмотрению кода, давайте немного обработаем этот код, используя numpy vstack
и append
для расширения массивов, кроме определения некоторых констант. Я также переименовал array
в my_array
.
import numpy as np
my_array, sums = np.empty((0, 4)), np.empty((1))
STEP = 60
MESSAGES = 100000
MAX_MEAN = 219000
for i, message in enumerate(message_generator(MESSAGES)):
values = np.array(message.value.decode("utf-8").split(',')).astype(float)
my_array = np.vstack([my_array, values])
if i % STEP == 0 and i > STEP:
sums = np.append(sums, np.sum(my_array[i - STEP:i, 3]))
l = np.arange(0, len(sums), 24)
if np.mean(sums[l]) >= MAX_MEAN:
print("Large ortalama")
np.arange
Теперь , ваш код создает список l
значений, от 0
до len(sums)
, с шагом 24
. Нет ничего плохого в np.arange
.
У вас есть массив sums
, к которому вы добавляете каждые 60 итераций сумму последних 60 итераций третий столбец вашего массива my_array
.
Затем вы переходите к генерации l
, а затем создаете среднее значение из значений sums
с индексами из l
. Это зависит только от получаемых вами сообщений.
Когда такое значение больше или равно заданному MAX_MEAN
, вы печатаете сообщение.
Предположим, что сумма каждого окна является константой constant_sum
. Назовем множество этих констант elements
. Очевидно, что ваше среднее значение ortalama
равно constant_sum
.
Как вы можете видеть, elements_step
упрощается от функции и рассматривается только в функции входных сообщений.
elements = np.array([])
elements_step = 5
constant_sum = 1000
upper_limit = 10000
for i in range(1000):
elements = np.append(elements, constant_sum)
l = np.arange(0, len(elements), elements_step)
ortalama = np.mean(elements[l])
if ortalama >= upper_limit:
print("Large ortalama")
ortalama
печатаются ровно столько раз, сколько приращение функцииnp.arange
. – Yashar Ahmadov 13 July 2018 в 10:28np.arange
полностью упрощается. – Luca Cappelletti 13 July 2018 в 10:52