Многопоточная реализация Python для функции to_datetime - PullRequest
0 голосов
/ 02 октября 2018

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

У меня есть словарь, и каждый ключ в этом словаре (из примерно 40) представляет собой временную метку pandas dataframe.Большинство фреймов данных имеют более 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 ]

0 голосов
/ 02 октября 2018

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

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

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

0 голосов
/ 02 октября 2018

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

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

...