簡體   English   中英

加快Python代碼時間

[英]Speeding Up Python Code Time

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內,然后存儲最短的坐標。

一旦結果已知,就利用任何機會突破for循環。 例如,在for line循環結束時,檢查successful_single == len(coords_line) 但是,這不會發生任何時間聲明if loop_count != 0是假的,因為在這一點上successful_single將不會增加; 你知道它的價值永遠不會達到len(coords_line) 所以你可以在那里打破for item循環 - 你已經知道它不是“successful_trip”。 可能還有其他類似的情況。

您是否考慮過並行匯集和運行這些計算?

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

您的代碼還建議變量R,interval可能會創建依賴關系並需要線性解決方案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM