Python 在多处理中,strftime运行缓慢

Python 在多处理中,strftime运行缓慢,python,datetime,pandas,multiprocessing,strftime,Python,Datetime,Pandas,Multiprocessing,Strftime,在数据帧内使用时间戳时,我看到了一种行为。我正在处理的项目要求我读入数据,将日期字符串转换为日期时间对象,然后将日期时间对象转换回具有不同格式的字符串。我使用data\u frame.dt.strftime()进行转换。当我移动使用多处理池调用我的函数,而不是直接调用它时,我看到从日期时间转换为字符串时速度大大减慢。下面,我将介绍一些定时测量,包括有无多处理。用于运行这些测试的代码位于文章的底部 No multiprocessing Time to read: 0.286389112473 Ti

在数据帧内使用时间戳时,我看到了一种行为。我正在处理的项目要求我读入数据,将日期字符串转换为日期时间对象,然后将日期时间对象转换回具有不同格式的字符串。我使用
data\u frame.dt.strftime()
进行转换。当我移动使用多处理池调用我的函数,而不是直接调用它时,我看到从日期时间转换为字符串时速度大大减慢。下面,我将介绍一些定时测量,包括有无多处理。用于运行这些测试的代码位于文章的底部

No multiprocessing
Time to read: 0.286389112473
Time to convert to string: 0.160706996918
Total time: 0.4490878582 s

With multiprocessing
Time to read: 0.287585020065
Time to convert to string: 6.90422201157
Total time: 7.23801398277 s
此测试表明,在数据帧中读取数据(将字符串转换为日期时间)所需的时间差别不大,但从多处理中调用时,将字符串转换回原来的时间要长得多。这有什么原因吗?有办法解决这个问题吗

编辑:

为了澄清一下,在本例中,我有意向多处理池提供一个进程。我对直接调用测试函数或通过多处理调用测试函数时运行时的差异感兴趣

我当然希望在将数据传输到辅助进程时会有少量开销,但我发现在处理数据帧时效率会更低。也就是说,当我处理相同的数据、使用相同的代码、提供相同的资源时,将列从日期时间对象转换为字符串所需的时间将延长40倍。如果我尝试使用
to_csv()


我的系统配置如下:

  • 操作系统:Mac
  • Python发行版:2.7.11 | Anaconda 2.5.0
  • 熊猫版本:0.18.1
  • 多处理版本:0.70a1
运行定时测试的代码:

from __future__ import print_function

import time
import pandas as pd
import multiprocessing


# ------------------------------------------------------------------------------
def test_timing(file_name):
    date_format = '%a %b %d %H:%M:%S %Z %Y'
    date_parser = lambda x: pd.to_datetime(x, format=date_format)

    tic = time.time()
    df = pd.read_csv(file_name,
                     names=['date_time'],
                     parse_dates=['date_time'],
                     date_parser=date_parser,
                     nrows=50000)
    print('Time to read: {}'.format(time.time() - tic))

    tic = time.time()
    date_format = '%Y-%m-%d'
    df['date'] = df['date_time'].dt.strftime(date_format)
    print('Time to convert to string: {}'.format(time.time() - tic))

    return df


# ------------------------------------------------------------------------------
print('No multiprocessing')
tic = time.time()
df = test_timing('sample_data.csv')
# print(df.head())
print('Total time: {} s'.format(time.time() - tic))
print()

# ------------------------------------------------------------------------------
print('With multiprocessing')
tic = time.time()
pool = multiprocessing.Pool(1)
df = pool.map(test_timing, ['sample_data.csv'])
# print(df[0].head())
print('Total time: {} s'.format(time.time() - tic))

在做了更多的测试之后,这种情况似乎发生在我的笔记本电脑上的环境中,但在我们的linux集群(使用linux系统)上工作时不会发生。我不确定这是否有帮助。对不起,一开始我完全误解了这个问题(后来又有一点)。我在linux上运行了这段代码,时间没有显著差异。不知道发生了什么。所以,我认为我的答案毫无用处,我将删除它。(为了完全确定这与
打印
无关,我将
time.time()
放在它之外。)感谢您的帮助!我将尝试安装另一个python发行版,看看它是针对mac版的anaconda发行版还是我电脑上的其他版本。在做了一些测试后,这种情况似乎发生在我笔记本电脑上的环境中,但在我们的linux群集(使用linux系统)上工作时不会发生。我不确定这是否有帮助。对不起,一开始我完全误解了这个问题(后来又有一点)。我在linux上运行了这段代码,时间没有显著差异。不知道发生了什么。所以,我认为我的答案毫无用处,我将删除它。(为了完全确定这与
打印
无关,我将
time.time()
放在它之外。)感谢您的帮助!我将尝试安装另一个python发行版,看看它是针对mac版的anaconda发行版的,还是我电脑上更深入的版本。