【问题标题】:vectorization / parallelization of the computation of pairwise distances with a given function使用给定函数计算成对距离的矢量化/并行化
【发布时间】:2020-09-20 10:01:45
【问题描述】:

我有一个问题,即有效计算所有对 i

我有一个轨迹列表 tr,以 numpy 数组的形式,其中一行包含纬度和经度。两条轨迹 tri 和 trj 之间的距离是 DFD(离散 Frechet 距离)。我找到了一个实现here,但如果有更高效的版本,非常欢迎提出建议。

import numpy
import pandas
import time 
import traj_dist.distance as td

m=10; n=1000; 
tr=[numpy.concatenate([180*numpy.random.random_sample((n-i,1))-90,
                       360*numpy.random.random_sample((n-i,1))-180],axis=1) for i in range(m)]    
t0=time.perf_counter(); 
dd=[td.discret_frechet(tr[i],tr[j]) for i in range(n) for j in range(i+1,m)]; 
t1=time.perf_counter(); print(t1-t0)
dd=td.pdist(tr,metric="discret_frechet")
t2=time.perf_counter(); print(t2-t1)

对于 m=10 和 n=10000,代码已经太慢了。有没有办法并行化矢量化?另外,是否有使用点之间的半正弦距离的 DFD 实现?

【问题讨论】:

    标签: pandas performance parallel-processing vectorization processing-efficiency


    【解决方案1】:

    我找到了两种解决方案:

    import time
    import numpy
    import multiprocessing as mp
    import ray; ray.init(memory=1*1024*1024*1024,object_store_memory=1*1024*1024*1024)
    import traj_dist.distance as td #for computing distance between trajectories, see https://github.com/bguillouet/traj-dist
    
    m=20; n=1000; tr=[numpy.random.rand(n,2) for i in range(m)]   #trajectories
    def ti(): return time.perf_counter()
    
    t0=ti(); d=td.pdist(tr,    metric="discret_frechet"); t1=ti(); print(t1-t0,d[:10]) #(m over 2) vector of dist(tri,trj) where tri, trj in tr
    t0=ti(); d=[td.discret_frechet(tr[i],tr[j]) for i in range(m) for j in range(i+1,m)]; t1=ti(); print(t1-t0,numpy.array(d[:10])) 
    
    def f(ti,tj): return td.discret_frechet(ti,tj) #must be at top level (not inside another function)
    t0=ti(); pl=mp.Pool(mp.cpu_count()); d=pl.starmap(f,[(tr[i],tr[j]) for i in range(m) for j in range(i+1,m)]); pl.close(); t1=ti(); print(t1-t0,numpy.array(d[:10]))
    
    @ray.remote
    def g(ti,tj): return td.discret_frechet(ti,tj)
    t0=ti(); d=ray.get([g.remote(tr[i],tr[j]) for i in range(m) for j in range(i+1,m)]); t1=ti(); print(t1-t0,numpy.array(d[:10])) 
    

    【讨论】:

      猜你喜欢
      • 2018-01-30
      • 2018-06-13
      • 1970-01-01
      • 2015-03-11
      • 2015-03-22
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多