有人告訴我,我也相信,Clojure比Python更快。為什么這段Python代碼的運行速度比這段看似相同的Clojure代碼快?是不是Python在編譯時做了一些優化?
def find_fifty(n, memory=1,count=0)。)
if memory < 0.5:
return count
else:
return find_fifty(n,memory*(1 - count/n),count 1)
find_fifty(100000)?
(defn fifty)
([n] (fifty n 1 0)
([n記憶體數]
(if (< 記憶體0。 5) count (recur n (*記憶體 (- 1(/ count n)) (inc count) ) )
)
)
(fifty 100000)
感覺Clojure的時間復雜度比Python的高。Python函式可以接受比Clojure函式高很多倍的輸入,然后才有明顯的運行時間增加。
uj5u.com熱心網友回復:
Clojure的除法運算子,當應用于整數時,會進行精確的有理除法。它不像Python那樣四舍五入到下一個最低的整數。你的演算法涉及memory成為一個非常復雜的分數,盡管產生了一個簡單的整數。
我已經修改了你的函式,在最后回傳結果之前列印它的中間值:
我已經修改了你的函式。
(defn fifty
([n] (fifty n 1 0)
([n記憶體數] 。
(if (< 記憶體 0.5)
數
(do (println n (*> 記憶體 (- 1 (/> count n)) (inc count))
(fifty n (* 記憶體 (- 1 (/ count n) ) (inc count))))))
而這里是結果:
(fifty 500)
500 1 1
500 499/500 2
500 124251/125000 3
500 61752747/62500000 4
500 1914335157/1953125000 5
500 189519180543/195312500000 6
500 46811237594121/48828125000000 7
500 23077940133901653/24414062500000000 8
500 2838586636469903319/3051757812500000000 9
500 1393746038506722529629/1525878906250000000000 10
500 68293555886829403951821/76293945312500000000000 11
500 33395548828659578532440469/38146972656250000000000000 12
500 2037128478548234290478868609/2384185791015625000000000000 13
500 992081569052990099463209012583/1192092895507812500000000000000 14
500 241075821279876594169559790057669/298023223876953125000000000000000 15
500 23384354664148029634447299635593893/29802322387695312500000000000000000 16
500 2829506914361911585768123255906861053/3725290298461914062500000000000000000 17
500 1366651839636803295926003532603013888599/1862645149230957031250000000000000000000 18
500 329363093352469594318166851357326347152359/465661287307739257812500000000000000000000 19
500 158423647902537874867038255502873972980284679/232830643653869628906250000000000000000000000 20
500 475270943707613624601114766508621918940854037/727595761418342590332031250000000000000000000 21
500 227654782035946926183933973157629899172669083723/363797880709171295166015625000000000000000000000 22
500 54409492906591315357960219584673545902267911009797/90949470177292823791503906250000000000000000000000 23
500 25953328116444057425747024741889281395381793551673169/45474735088646411895751953125000000000000000000000000 24
500 3088446045856842833663895944284824486050433432649107111/5684341886080801486968994140625000000000000000000000000 25
500 58680474871280013839614022941411665234958235220333035109/113686837721616029739379882812500000000000000000000000000 26
500 13907272544493363279988523437114564660685101747218929320833/28421709430404007434844970703125000000000000000000000000000 27
27
我希望你能看到,即使是很小的輸入,要計算這些不合理的分數也是很昂貴的。如果你想獲得與Python版本相同的邏輯,你可以簡單地將/替換為quot。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/331578.html
標籤:
