我正在努力理解threading
,但我想我只是在困惑自己。
我有一个使用第三方API的Emmys
类。在课程中,我使用create_data
方法查询数据库并创建Pandas DataFrame
,然后我加入另一个DataFrame
。
该课程如下:
import inro.emme.database.emmebank as _bank
from pandas import DataFrame
import numpy as np
class Emmys(object):
def __init__(self):
self.df = DataFrame(data=np.arange(24), columns=["Hour"])
def create_data(self,path,names):
d = []
columns = ["Hour"]
columns.extend(names)
with _bank.Emmebank(path) as bank:
for scenario in bank.scenarios():
if 2000 <= scenario.number < 3000:
vmt = []
vht = []
hour = int(bank.scenario(scenario.number).title.split()[1].split("-")[0])
network_links = bank.scenario(scenario.number).get_network().links()
for link in network_links:
if 1 <= link.volume_delay_func <= 9:
vmt.append(link.length * link.auto_volume)
vht.append((link.auto_time/60) * link.auto_volume)
d.append([hour,sum(vmt),sum(vht)])
temp = DataFrame(d,columns=columns)
self.df = DataFrame.merge(self.df, temp, how="left", on="Hour")
要调用create_data
方法,我已经创建了threading
和常规方法。
线程方法
from threading import Thread
from datetime import datetime
startTime = datetime.now()
e1 = Emmys()
p1 = "I:/ModServStaff/1/emmebank"
p2 = "I:/ModServStaff/2/emmebank"
t1 = Thread(target=e1.create_data, args=(p1,["VMT_PS","VHT_PS"]))
t2 = Thread(target=e1.create_data, args=(p2,["VMT_NPS","VHT_NPS"]))
t1.start()
t2.start()
t1.join()
t2.join()
print datetime.now() - startTime
# 0:04:51.103000 minutes to run
常规方法
startTime = datetime.now()
e = Emmys()
path = "I:/ModServStaff/1/emmebank"
e.create_data(path,["VMT_PS","VHT_PS"])
path = "I:/ModServStaff/2/emmebank"
e.create_data(path,["VMT_NPS","VHT_NPS"])
print datetime.now() - startTime
#0:01:51.793000 minutes to run
我得到两个不同的结果
使用我的e1
(线程),我得到以下DataFrame
e1.df.head()
Hour VMT_NPS VHT_NPS
0 0 372340.128855 8427.114585
1 1 253214.489522 5640.123767
2 2 227031.655104 5062.068237
3 3 245598.203502 5473.983267
4 4 348784.430498 7787.368914
使用e
对象(使用常规方法)我得到:
e.df.head()
Hour VMT_PS VHT_PS VMT_NPS VHT_NPS
0 0 372340.128855 8427.114585 372340.128855 8427.114585
1 1 253214.489522 5640.123767 253214.489522 5640.123767
2 2 227031.655104 5062.068237 227031.655104 5062.068237
3 3 245598.203502 5473.983267 245598.203502 5473.983267
4 4 348784.430498 7787.368914 348784.430498 7787.368914
使用常规方法,我得到了我想要的DataFrame
。我的threading
方法仅返回_NPS
列,这有什么问题?以及为什么threading
方法需要更长时间才能运行?我认为常规方法会更快。