把一個python程式改寫成Julia
Julia程式碼臃腫了不少,速度兩者差不多.
兩種語言還有下列不同:
1.字典對於不存在的鍵值,julia沒有預設值,必須用hashkey函式判斷,直接訪問報錯,python預設0。
2.對於整數和Bool兩種型別的變數。julia不能相加,python可以加。
3.對於BigInt型別,julia必須用賦值顯式宣告變數型別,python可以自動判斷並設定。
4.Bool型別常量,julia全小寫,Python首字母大寫,其餘小寫。
5.for迴圈的上下邊界,julia都包含,Python的Range包含下限,不包含上限。
6.'或','否'條件運算子,julia用||,==0 ,Python用or和not
7.遍歷字典時,Julia必須定義一個遊標型別,Python可以直接用變數代表鍵值。
8.判斷迴圈正常結束,沒有中途退出。Python有一個else語法,Julia只能用標誌變數。
python
from collections import defaultdict def f(l): d = defaultdict(int) for i in range(1, 10): d[1<<(i%l), 0, i%l==0] += 1 for i in range(l-1): d, d2 = defaultdict(int), d for (bm,dbm,bl), cn in d2.items(): for j in range(10): nbm = ndbm = 0 t = bl for k in range(l): c = (k==0) + ((bm&(1<<k))!=0) + ((dbm&(1<<k))!=0) if not c: continue z = (k * 10 + j) % l if z==0: if t+c>1: break t = True if (nbm & (1<<z)) or c>1: ndbm |= 1<<z nbm |= 1 << z else: d[nbm, ndbm, t] += cn return sum(c for (bm, dbm, bl), c in d.items() if bl) def go(N): return sum(map(f, range(1, N+1))) go(15)
julia
function f(l::Int) d=Dict{Tuple{Int,Int,Bool},BigInt}() for i in 1:10-1 a=(1<<(i%l),0,i%l==0) if haskey(d, a) d[a]+=1 else d[a]=1 end end for i in 0:l-1-1 d, d2 = Dict{Tuple{Int,Int,Bool},BigInt}(), d for x in d2 (bm,dbm,bl), cn = x.first,x.second #println(bm) for j in 0:10-1 nbm = ndbm = 0 t = bl flag =0 for k in 0:l-1 c = (k==0) + ((bm&(1<<k))!=0) + ((dbm&(1<<k))!=0) if c==false continue end z = (k * 10 + j) % l if z==0 if t+c>1 flag=1 break end t = true end if ((nbm & (1<<z))!=0) || c>1 ndbm |= 1<<z end nbm |= 1 << z #else: k not break out end #k if flag==0 a=(nbm, ndbm, t) if haskey(d, a) d[a]+=cn else d[a] = cn end #println(d[a]) end end #j end #x end #i sumc=BigInt(0) for x in d (bm,dbm,bl), c1 = x.first,x.second if bl sumc+=c1 end end return sumc end function go(N::Int) #return sum(map(f, 1:N+1-1)) sumc=BigInt(0) for x in 1:N+1-1 sumc+=f(x) end return sumc end go(15)
把上述julia程式碼中的BigInt
都修改為Int128
,其他不動,速度提高了20%.
julia> @time go128(19) 39.090864 seconds (245.53 M allocations: 3.208 GB, 6.47% gc time) 3079418---040719 julia> @time go(19) 51.460135 seconds (301.17 M allocations: 3.782 GB, 11.80% gc time) 3079418---040719
相關文章
- 把一個Python程式改寫為JuliaPython
- 將使用yield的python程式改寫成JuliaPython
- 幽默:把Java寫成Python風格的程式碼JavaPython
- Julia會成為下一個程式設計大語言嗎?程式設計
- 把一個程式註冊成系統服務
- 手把手教你把Vim改裝成一個IDE程式設計環境(圖文)IDE程式設計
- 一個Julia編寫的求解線性模型的包模型
- 一個巧合,我把文件寫進了程式碼裡
- Java 把多個音訊拼接成一個Java音訊
- 改寫一個要跑5小時的SQL成1分鐘SQL
- 一個julia語言部落格
- 如何把多個pdf合併成一個pdf文件?
- iStylePDF把多個PDF合併成一個PDF檔案
- 我打算寫一個《程式設計師的成長課》程式設計師
- Python使用Socket寫一個簡單聊天程式Python
- MySQL LIMIT 如何改寫成Oracle limitMySqlMITOracle
- 把C#程式(含多個Dll)合併成一個Exe的超簡單方法C#
- 怎樣把自己培養成為一個優秀的程式設計師程式設計師
- 用 Python 編寫一個國際象棋 AI 程式PythonAI
- 使用PyQt來編寫第一個Python GUI程式QTPythonGUI
- 面試:一個單例模式,足以把你秒成渣面試單例模式
- 亞馬遜如何把廣告發展成下一個支柱業務?亞馬遜
- Luxi把iPhone變成一個入射光測光表UXiPhone
- 我寫的一個小程式,改變分割槽序列號。編譯成COM檔案執行。 (2千字)編譯
- Python的四個挑戰者:Swift、Go、Julia、RPythonSwiftGo
- 如何讓 Python 像 Julia 一樣快地執行Python
- 把一個JVM嵌入到本地程式中JVM
- 將一個前端專案改寫為chromo外掛(一)前端
- Julia加入TPU,這是一個靠自己也要融入機器學習的程式語言機器學習
- 如何把多張jpg轉換成一個pdf檔案?
- 寫的一個perl程式
- 把程式碼寫在照片裡
- 如何把C/C++程式編譯成Python模組-超實用C++編譯Python
- 七個不一樣的Python程式碼寫法,讓你寫出一手漂亮的程式碼Python
- 使用 Python 把多個 MP4 合成一個視訊Python
- Python新手教程:40行python程式碼寫一個桌面翻譯器Python
- 一條SQL的改寫SQL
- 50行Python程式碼寫一個語言檢測器Python