Что является причиной узкого места при сборке путей в кадре данных - PullRequest
0 голосов
/ 17 декабря 2018

Цикл в этой функции - самая медленная часть кода моего проекта

Функция предназначена для импорта таблицы из mySQL - таблица имеет Image_DateTaken, Image_Path, Image_InAlbum и * 1006.* columns.

Он циклически перебирает строки в кадре данных, получая год из Image_DateTaken и собирая пути типа 2015-16/Album или 2016-17 в зависимости от того, больше ли Image_InAlbum больше 1 (в этом случаеAlbum часть добавлена).

Затем записывает этот новый путь в столбец моего dataFrame и экспортирует обратно в sql.

import pandas as pd
from pathlib import Path
#album reads and writes dataframes to sql and back

def write_directoryPath_to_Images():
    "Imaginary Create database folder with all images in folders of Date, subfolders of album"

    #read data
    images_df = album.read_sql('images')
    results_df = pd.DataFrame(['Image_DirectoryPath'])
    images_df.Image_DateTaken = pd.to_datetime(images_df.Image_DateTaken, errors= 'coerce')

    #group by date (year)
    grouped = images_df.groupby(images_df.Image_DateTaken.dt.year)
    images_df.set_index('Image_Path',inplace=True)
    #loop through groups and match them to image paths
    print("Looping through {} groups".format(len(grouped)))
    for date, group in grouped:
        year = '{0:g}-{1}'.format(date, '{0:g}'.format(date+1)[-2:])
        for path in group.index:
            base = Path(year)

            relPath = base.joinpath('Album') if images_df.Image_InAlbum[path] > 0 else base

            images_df['Image_DirectoryRelPath'][path] = str(relPath)

    #clean up

    images_df.reset_index(inplace=True)
    album.to_sql(images_df,'images')

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

for path in group.index:
    base = Path(year)

    relPath = base.joinpath('Album') if images_df.Image_InAlbum[path] > 0 else base

    images_df['Image_DirectoryRelPath'][path] = str(relPath)

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

...