一千萬個為什麽

搜索

檢查點是否在線上時與無窮大的比較


我有一個在緊密循環中調用的函數。我已經分析了我的代碼,這是我最大的瓶頸所在。該函數非常簡單:它檢查(x,y)形式的點是否在(斜率,截距)形式的線上方。 問題是,它還必須處理斜率為正無窮大的情況,並且截距給出x截距。在這種情況下,如果該點位於該行的右側,則該函數應返回 True 。 這是函數寫出當我註意到瓶頸時的情況: def point_over(point, line): """Return true if the point is above the line. """ slope, intercept = line if slope != float("inf"): return point[0] * slope + intercept < point[1] else: return point[0] > intercept

在我的機器上,這是它運行的速度:

timeit("pointover((2.412412,3.123213), (-1.1234,9.1234))", "from _main__ import point_over", number = 1000000) 1.116534522825532

由於這個函數被大量調用,我已經內聯它以避免函數調用開銷。內聯版本非常簡單: point[0] * line[0] + line[1] < point[1] if line[0] != float('inf') else point[0] > line[1]

並在 timeit 中執行類似的操作:

timeit("point[0] * line[0] + line[1] < point[1] if line[0] != float('inf') else point[0] > line[1]", "point, line = ((2.412412,3.123213), (-1.1234,9.1234))", number = 1000000) 0.9410096389594945

但是,即使在內聯之後,這一行代碼仍然占據了代碼執行時間的最大比例。 為什麽與 float('inf')的比較需要比一些計算和比較更長的時間?有沒有辦法讓這更快? 作為我所聲稱的一個例子,這裏是我的三元語句的兩個部分的速度分開和定時:

timeit("line[0] != float('inf')", "point, line = ((2.412412,3.123213), (-1.1234,9.1234))", number = 1000000) 0.528602410095175 timeit("point[0] * line[0] + line[1] < point[1]", "point, line = ((2.412412,3.123213), (-1.1234,9.1234))", number = 1000000) 0.48756339706397966

我的主要問題是為什麽與無窮大進行比較需要這麽長時間。中學是關於如何加快這些速度的任何提示。理想情況下,存在一些神奇的(即使是令人難以置信的hacky)方式,這一行的執行時間的一半,而不是下降到C.否則,告訴我,我需要下降到C.

最佳答案

暫時沒有最佳答案

轉載註明原文: 檢查點是否在線上時與無窮大的比較

猜你喜歡