Многопоточная реализация Python для функции to_datetime

Мне нужно реализовать многопоточность на работу Python.

У меня есть словарь, и каждый ключ в этом словаре (из примерно 40) является меткой времени для панд с метками времени. Большинство фреймов данных имеют более 100 000 строк. Их временные метки являются строками в "%Y-%m-%d %H:%M:%S" формат.

Для преобразования строк с метками времени я использую следующую функцию:

def to_dt(df):
    df['timestamp'] = df['timestamp'].map(lambda n: pd.to_datetime(n, format='%Y-%m-%d %H:%M:%S'))
    return df

Поэтому я хотел бы поставить каждый процесс to_dt(df) в отдельной теме. Как я могу это сделать?

Для упрощения давайте рассмотрим следующую настройку:

def to_dt(df):
    df['timestamp'] = df['timestamp'].map(lambda n: pd.to_datetime(n, format='%Y-%m-%d %H:%M:%S'))
    return df

# empty dictionary
d_test = {}

# dataframe with single string timestamp column
df = pd.DataFrame(columns=['st_dt'])

# populate dataframe with 1000 timestamp rows
for i in range(1000):
    df.loc[len(df)] = ['2018-10-02 10:00:00']

# add 20 instances of the dataframe to the dictionary with keys in format "a0" to 'a19'
for i in range(20):
    d_test['a'+str(i)] = df

Теперь, как мы можем сделать каждую итерацию

for i in range(20): to_dt(d_test['a'+str(i)])

запустить в отдельном потоке?

2 ответа

Решение

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

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

Также этот пост довольно хорошо объясняет GIL.

Просто прочитайте, что многопоточность в Python должна использоваться только в том случае, если существует какое-то ожидание во время выполнения процесса, например, при подключении к удаленному серверу или при сканировании портов и т. Д.

В приведенном выше случае ожидание не требуется, поэтому нити не нужны.

Другие вопросы по тегам