我可以使用Python多处理来让它在windows上运行得更快

问题描述:

我很难理解如何利用/学习如何在我的Python代码中使用多处理。我现在正在处理csv文件,这些文件在windows操作系统上有几个演出和数千万条记录,并开始遇到巨大的处理速度障碍。我有以下代码:我可以使用Python多处理来让它在windows上运行得更快

import numpy as np 
import pandas as pd 
import datetime as dt 

df = pd.read_csv(r'C:...\2017_import.csv') 

df['FinalActualDate'] = pd.to_datetime(df['FinalActualDate']) 
df['StartDate'] = pd.to_datetime(df['StartDate']) 

df['DaysToInHome'] = (df['FinalActualDate'] - df['StartDate']).abs()/np.timedelta64(1, 'D') 

df.to_csv(r'C:...\2017_output4.csv', index=False) 

数据在文件上是3.6演出。数据如下:

Class,OwnerCode,Vendor,Campaign,Cycle,Channel,Product,Week,FinalActualDate,State,StartDate 
3,ECM,VendorA,000206,06-17,A,ProductB,Initial,2017-06-14 02:01:00,NE,06-01-17 12:00:00 
3,ECM,VendorB,000106,06-17,A,ProductA,Initial,2017-06-14 00:15:00,NY,06-01-17 12:00:00 
3,ECM,AID,ED-17-0002-06,06-17,B,ProductB,Secondary,2017-06-13 20:30:00,MA,06-08-17 12:00:00 
3,ECM,AID,ED-17-0002-06,06-17,C,ProductA,Third,2017-06-15 02:13:00,NE,06-15-17 12:00:00 

此代码适用于小型数据集,但实际大型数据集需要几个小时。我尝试了几次迭代,导入concurrent.futures和multiprocessing没有成功。我很失落,不值得我发布我试过的东西。我意识到其他因素影响速度,但获得新硬件不是一种选择。任何指导将不胜感激。

+0

你是在一个巨型文件或许多巨型文件上运行?我们在谈论什么样的文件大小? –

+0

你的数据是什么样的?特别是“FinalScanActualDate”和“MailDate”列的外观如何?他们是否经常?如果是这样的话,只要使用'format'参数到'pd.to_datetime',就可以获得很多**的性能,或者如果你期望重复很多,可以尝试记忆它。该函数使用日期分析器来推断您的格式,这是一项昂贵的操作。 –

+0

@BrendenPetersen对不起,这是一个巨大的3.6 gig文件,超过3000万条记录。我更新了这个问题。 –

在你走之前关进multiprocessing,我会考虑处理一些唾手可得的(你会想,无论做):

考虑:

In [15]: df 
Out[15]: 
    Class OwnerCode Vendor  Campaign Cycle Channel Product \ 
0  3  ECM VendorA   000206 06-17  A ProductB 
1  3  ECM VendorB   000106 06-17  A ProductA 
2  3  ECM  AID ED-17-0002-06 06-17  B ProductB 
3  3  ECM  AID ED-17-0002-06 06-17  C ProductA 

     Week  FinalActualDate State   StartDate 
0 Initial 2017-06-14 02:01:00 NE 06-01-17 12:00:00 
1 Initial 2017-06-14 00:15:00 NY 06-01-17 12:00:00 
2 Secondary 2017-06-13 20:30:00 MA 06-08-17 12:00:00 
3  Third 2017-06-15 02:13:00 NE 06-15-17 12:00:00 

由于您的日期时间格式是规则的,只是通过format参数。做一个简单的测试:

In [16]: dates = df.StartDate.repeat(10000) 

In [17]: len(dates) 
Out[17]: 40000 

In [18]: %timeit pd.to_datetime(df.StartDate) 
1000 loops, best of 3: 866 µs per loop 

In [19]: %timeit pd.to_datetime(df.StartDate, format="%m-%d-%y %H:%M:%S") 
10000 loops, best of 3: 106 µs per loop 

我得到了8倍的速度增加。除非您正在使用8核以上的内核,否则这比平行化的速度要快得多。