加快Python代码时间

时间:2017-03-29 01:05:55

标签: python python-2.7 python-3.x

start = time.time()
import csv
f = open('Speed_Test.csv','r+')
coordReader = csv.reader(f, delimiter = ',')
count = -1
successful_trip = 0
trips = 0

for line in coordReader:
    successful_single = 0
    count += 1
    R = interval*0.30
    if count == 0:
        continue
    if 26 < float(line[0]) < 48.7537144 and 26 < float(line[2]) <   48.7537144 and -124.6521017 < float(line[1]) < -68 and -124.6521017 < float(line[3]) < -68:
        y2,x2,y1,x1 = convertCoordinates(float(line[0]),float(line[1]),float(line[2]),float(line[3]))
        coords_line,interval = main(y1,x1,y2,x2)

        for item in coords_line:
            loop_count = 0
            r = 0
            min_dist = 10000

            for i in range(len(df)):
                dist = math.sqrt((item[1]-df.iloc[i,0])**2 + (item[0]-df.iloc[i,1])**2)
                if dist < R:
                    loop_count += 1
                    if dist < min_dist:
                        min_dist = dist
                        r = i
            if loop_count != 0:
                successful_single += 1
                df.iloc[r,2] += 1

        trips += 1
        if successful_single == (len(coords_line)):
            successful_trip += 1

end = time.time()
print('Percent Successful:',successful_trip/trips)
print((end - start))

我有这个代码并解释它会非常耗时,但它并不像我需要的那样快速运行,以便能够像我一样计算。有没有人能看到我能做些什么来加速这个过程?任何建议将不胜感激。

本质上,它读入2个纬度和长度坐标,并将它们更改为笛卡尔坐标,然后根据距离以一定的间隔长度沿着从原点坐标到目标坐标的路径中的每个坐标。正如它所做的那样,尽管存在一个具有300多个坐标位置的数据框(df),它会检查每个行程间隔,并查看是否在半径R内,然后存储最短的。

2 个答案:

答案 0 :(得分:0)

一旦结果已知,就利用任何机会突破for循环。例如,在?? ?循环结束时,您会检查是否for line。但是,只要语句successful_single == len(coords_line)为False,就会发生这种情况,因为此时if loop_count != 0不会增加;你知道它的价值永远不会达到successful_single。所以你可以在那里摆脱len(coords_line)循环 - 你已经知道它不是&#34; successful_trip。&#34;可能还有其他类似的情况。

答案 1 :(得分:0)

您是否考虑过并行汇集和运行这些计算?

https://docs.python.org/2/library/multiprocessing.html

您的代码还建议变量R,interval可能会创建依赖关系并需要线性解决方案