Как увеличить скорость python над циклами?

У меня есть набор данных из 370 тыс. Записей, хранящихся в кадре данных Pandas, который необходимо интегрировать. Я пробовал многопроцессорную обработку, потоки, Cpython и разворот цикла. Но я не увенчался успехом, и время, показанное для вычисления, было 22 часа. Задача следующая:

%matplotlib inline from numba import jit, autojit import numpy as np import pandas as pd import matplotlib.pyplot as plt with open('data/full_text.txt', encoding = "ISO-8859-1") as f: strdata=f.readlines() data=[] for string in strdata: data.append(string.split('\t')) df=pd.DataFrame(data,columns=["uname","date","UT","lat","long","msg"]) df=df.drop('UT',axis=1) df[['lat','long']] = df[['lat','long']].apply(pd.to_numeric) from textblob import TextBlob from tqdm import tqdm df['polarity']=np.zeros(len(df)) 

Заправка:

  from queue import Queue from threading import Thread import logging logging.basicConfig( level=logging.DEBUG, format='(%(threadName)-10s) %(message)s', ) class DownloadWorker(Thread): def __init__(self, queue): Thread.__init__(self) self.queue = queue def run(self): while True: # Get the work from the queue and expand the tuple lowIndex, highIndex = self.queue.get() a = range(lowIndex,highIndex-1) for i in a: df['polarity'][i]=TextBlob(df['msg'][i]).sentiment.polarity self.queue.task_done() def main(): # Create a queue to communicate with the worker threads queue = Queue() # Create 8 worker threads for x in range(8): worker = DownloadWorker(queue) worker.daemon = True worker.start() # Put the tasks into the queue as a tuple for i in tqdm(range(0,len(df)-1,62936)): logging.debug('Queueing') queue.put((i,i+62936 )) queue.join() print('Took {}'.format(time() - ts)) main() 

Многопроцессорность с разверткой цикла:

 pool = multiprocessing.Pool(processes=2) r = pool.map(assign_polarity, df) pool.close() def assign_polarity(df): a=range(0,len(df),5) for i in tqdm(a): df['polarity'][i]=TextBlob(df['msg'][i]).sentiment.polarity df['polarity'][i+1]=TextBlob(df['msg'][i+1]).sentiment.polarity df['polarity'][i+2]=TextBlob(df['msg'][i+2]).sentiment.polarity df['polarity'][i+3]=TextBlob(df['msg'][i+3]).sentiment.polarity df['polarity'][i+4]=TextBlob(df['msg'][i+4]).sentiment.polarity 

Как увеличить скорость вычислений? или быстрее хранить вычисления в кадре данных? Конфигурация моего ноутбука

  • Рам: 8 ГБ
  • Физические ядра: 2
  • Логические ядра: 8
  • Windows 10

Внедрение Multiprocessing дало мне более высокое время вычисления. Threading выполнялось последовательно (я думаю, из-за GIL) Loop Unrolling дал мне ту же скорость вычислений. Cpython давал мне ошибки при импорте библиотек.

    ASD – я заметил, что хранение чего-то в df итеративно ОЧЕНЬ медленно. Я бы попытался сохранить ваши TextBlob в списке (или другой структуре), а затем преобразовать этот список в столбец df.