Многопоточная реализация 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 должна использоваться только в том случае, если существует какое-то ожидание во время выполнения процесса, например, при подключении к удаленному серверу или при сканировании портов и т. Д.
В приведенном выше случае ожидание не требуется, поэтому нити не нужны.