假设我有一个字典,其中每个元素是由GPS坐标元组定义的四边形,并且还包含包含原始和目标点的GPS坐标的元组:((origin_latitude,origin_longitude),(dest_latitude, dest_longitude)),((...),(...)))。以下是两个四边形和两个行程的示例:
dictionary={0:((0,0),(0,1),(1,1),(1,0)),1:((3,3),(3,4),(4,4),(4,3))}
trips=(((0.5,0.5),(3.5,3.5)),((-1,-1),(-2,-2)))
我想将每次旅行分类为原始四边形号码,目的地四边形号码以及始发地和目的地之间的组合号码(旅行参考号码)。这就是我正在做的事情:
import matplotlib.path as mplPath
def is_in_zone(quadri,point):
bbPath = mplPath.Path(quadri)
return bbPath.contains_point(point)
def get_zone_nbr(dictio,trip):
start_zone=-1
end_zone=-1
trip_ref=-1
for key,coordinates in dictio.iteritems():
if is_in_zone(coordinates,trip[0]):
start_zone=key
if is_in_zone(coordinates,trip[1]):
end_zone=key
if start_zone>-1 and end_zone>-1:
trip_ref=len(dictio)*start_zone+end_zone
break
return (start_zone,end_zone,trip_ref)
if __name__=='__main__':
dictionary={0:((0,0),(0,1),(1,1),(1,0)),1:((3,3),(3,4),(4,4),(4,3))}
trips=(((0.5,0.5),(3.5,3.5)),((-1,-1),(-2,-2)))
for t in trips:
get_zone_nbr(dictionary,t)
我的字典大约是30,所以函数get_zone_nbr会很慢。我有数百万次旅行需要处理。你看到任何明显的方法来优化get_zone_nbr()吗?或任何会使这段代码运行得更快的东西(例如多处理,但我不知道如何将它与循环一起使用)。
答案 0 :(得分:0)
简单的第一个并行是并行处理您的行程。
>>> import matplotlib.path as mplPath
>>> def is_in_zone(quadri,point):
... bbPath = mplPath.Path(quadri)
... return bbPath.contains_point(point)
...
>>> def get_zone_nbr(dictio,trip):
... start_zone=-1
... end_zone=-1
... trip_ref=-1
... for key,coordinates in dictio.iteritems():
... if is_in_zone(coordinates,trip[0]):
... start_zone=key
... if is_in_zone(coordinates,trip[1]):
... end_zone=key
... if start_zone>-1 and end_zone>-1:
... trip_ref=len(dictio)*start_zone+end_zone
... break
... return (start_zone,end_zone,trip_ref)
...
>>> dictionary={0:((0,0),(0,1),(1,1),(1,0)),1:((3,3),(3,4),(4,4),(4,3))}
>>> trips=(((0.5,0.5),(3.5,3.5)),((-1,-1),(-2,-2)))
>>>
>>> from pathos.pools import ThreadPool
>>> pool = ThreadPool()
>>>
>>> results = pool.map(lambda x: get_zone_nbr(dictionary, x), trips)
>>> results
[(0, 1, 1), (-1, -1, -1)]
我正在使用pathos
这是一个multiprocessing
分叉,它提供了更好的序列化,灵活性和交互性。 (我也是作者。)
然后,您还可以应用相同的方法将函数get_zone_nbr
中的for循环转换为map函数调用。 pathos
允许您使用带有多个参数的map
调用。由于您正在处理字典项目,并且这些项目自然是无序的,您可以使用“无序迭代地图”(pathos
中的uimap
,但multiprocessing
imap_unordered
map
1}})。
我还建议您为代码计时,看看哪个map
来电会更快。 pathos
调用有几种不同的变体,以及几种不同的并行后端。我在上面使用了一个线程池,但是在进程和套接字之间也存在并行(后者对于你的情况来说太慢了)。 pathos
为所有选项提供统一的API,因此您只需编码一次,然后放入任何其他池/地图,直到找到最适合您的情况的那个。
在此处获取library(dplyr)
X$time <- as.character(X$time)
X$hourmin <- substr(X$time, 1, 4)
X$time <- paste(X$hourmin, "0:00", sep = "")
X <- X %>% group_by(date, time)
%>% summarize(
speedAvg = mean(speed, na.rm=T)
,angleAvg = mean(angle, na.rm=T)
,speedMax = max(speed, na.rm=T)
,speedMin = min(speed, na.rm=T)
,speedSd = sd(speed, na.rm=T)
,datapoint_count = n())
%>% filter(datapoint_count >= 600))
#remove datapoint_count column.
X <- X[, -8]
:https://github.com/uqfoundation