Python to_datetime 函数的多线程实现

Python Multithreading Implementation of to_datetime Function

我需要对 Python 作业实施多线程。

我有一本字典,该字典中的每个键(大约 40 个)都是一个带时间戳的 pandas 数据帧。大多数数据框有 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)])

到 运行 在单独的线程中?

请注意 Python 中的线程仅应在进程执行期间存在某种等待时使用,例如连接到远程服务器或端口扫描等时

在上述情况下,没有任何等待,因此不需要 threadig。

由于GIL的存在,在Python任何时候只有一个线程运行,所以这种情况下的多线程只会让性能变差。

为了使用多核,您需要多处理而不是多线程,但是产生新进程的大量开销肯定会超过收益,因此在您的情况下最好使用单个 pd.to_datetime

另外 this post 很好地解释了 GIL。