for循环中的多处理

时间:2015-08-14 19:57:04

标签: python matplotlib gps multiprocessing polygon

假设我有一个字典,其中每个元素是由GPS坐标元组定义的四边形,并且还包含包含原始和目标点的GPS坐标的元组:((ori​​gin_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()吗?或任何会使这段代码运行得更快的东西(例如多处理,但我不知道如何将它与循环一起使用)。

1 个答案:

答案 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