Как ускорить питона для петли, перебирающей электронные письма перспективы - PullRequest
0 голосов
/ 13 сентября 2018

Я написал скрипт на python 3.5, который просматривает все электронные письма в моей папке outlook «Входящие», что-то делает, а затем перемещает электронные письма из папки входящих в папку «Отправленные».Из-за некоторых проблем с pyinstaller мне пришлось перейти на python 2.7, и после этого код стал очень медленно обрабатывать каждое письмо.

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

import os
import win32com.client
import itertools
import shutil

OlSaveAsType = {
    "olTXT": 0,
    "olRTF": 1,
    "olTemplate": 2,
    "olMSG": 3,
    "olDoc": 4,
    "olHTML": 5,
    "olVCard": 6,
    "olVCal": 7,
    "olICal": 8
}

desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')
newpath = desktop + '\\Mails2'
if not os.path.exists(newpath):
    os.makedirs(newpath)

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
folder = outlook.Folders("My Main Folder")
inbox = folder.Folders("Inbox")
sent_items = folder.Folders("Sent Items")

messages = inbox.Items
a = (len(messages))
message = messages.GetFirst()


#for message in messages:
for _ in itertools.repeat(None, a):

    messages = inbox.Items
    message = messages.GetFirst()

    Subject = message.subject
    Sender = message.Sender.GetExchangeUser().PrimarySmtpAddress
    Time = message.ReceivedTime
    message.SaveAs(newpath + '\\' + Sender + ".msg", OlSaveAsType['olMSG'])

    message.Move(sent_items)
    message = messages.GetNext() 

закомментированная строка (для сообщения в сообщениях :), кажется, быстрее, чемitertools, однако, когда я попытался использовать его, по какой-то причине я никогда не мог получить все сообщения в подпапке, сначала это заняло бы только половину сообщений (оказалось, я уменьшал контейнер сообщений с каждым циклом, перемещая почту в другойпапка), поэтому я попытался удалить messages.GetNext (), чтобы цикл for выполнял всю работу, но все равно было бы сообщение, оставленное неизменным, только itertools с длиной элементов inmail, казалось, делали эту работу.

1 Ответ

0 голосов
/ 14 сентября 2018

Во-первых, поскольку вы изменяете коллекцию, вы не должны использовать gGtFirst / GetNext.Используйте цикл dowb от Items.Count до 1.

Во-вторых, цикл над всеми элементами в папке, как ожидается, будет медленным.

...