github 提交 - gonum - floats.Norm()
收錄在 Ameba 的一百篇
--
繼 gonum floats Norm - vector dot product 這篇發現 Norm 做法有點慢,
做了個實驗
在這本 The GO Programming Language
第十一章 特別介紹了 Testing, 有點像 Java Unit Test
可以撰寫該 package 相關的 測試程式
並在 11.4 介紹了如何做 Benchmark
果然 GO 不虧是 21 世紀的 C 語言
首先先看一下 vector normalization
floats.go
原先做法:
可以發現, 它利用 math.Hypot() 這個函式.
每次把前次結果做平方, 加上新的 s[i] 平方值, 又再做開根號
我們試寫一個新的做法看看
很簡單, 先把各 s[i] 平方值 總合起來後, 再做 開根號
驗證:
Go 的 Test 程式 - floats_test.go
GO 會抓 檔名 *_test.go 中 func Test<Name>(t *testing.T) 來執行
並用 t.Error() 回報錯誤, ( t.Errorf() 類似 Printf, 可以設定 format )
執行只要在該目錄下, 跑 "go test" 即可
結果:
PASS
OK <執行目錄.> 0.002s
Benchmark : benchmark_test.go
檔案名稱同樣是用 _test.go 結尾, function 格式是 func Benchmark<name>(b *testing.B)
可以用 -bench= 來指定要跑的 benchmark function, 如果用 -bench=. 則會抓所有 package 中的 benchmark functions.
特別的是 for loop b.N 次數, 會用總共一秒鐘的時間來取得需要的次數
執行: $ go test -bench=.
結果:
goos: linux
goarch: amd64
BenchmarkNorm-4 30606816 36.5 ns/op
BenchmarkNorm1-4 168108007 7.16 ns/op
PASS
OK _<目錄> 3.089s
這邊 -4 代表目前 CPU 有幾核心, 也就是 GOMAXPROCS
可以發現我們修改後的方法, 比原本的快了5倍
===
github 提交
這作法是在 gonum 這個項目 - https://github.com/gonum/gonum
我們來提交看看.
1. 首先先 fork 一個到自己的 github : https://github.com/neojou/gonum
2. 在自己工作電腦上, git clone https://github.com/neojou/gonum
3. 修改 gonum/floats/floats.go
4. go test 看看
發現 會錯,
--- FAIL: TestDistance (0.00s)
floats_test.go:265: Distance does not match norm for case 1, 2. Expected 16.627687752661224, Found 16.62768775266122.
FAIL
exit status 1
FAIL gonum.org/v1/gonum/floats 0.005s
看了一下, 我們把 floats.go 中 Distance() 裡計算方式也改成我們的方式
5. git add floats/floats.go
6. git commit -s
寫完後可以用 git log 看一下
7. git push
把修改上傳到自己的 github
這時候可以再看一下有沒有要修改的, 有的話
git commit --amend
git pull
git push
8. pull request
https://help.github.com/en/articles/creating-a-pull-request-from-a-fork
到原本的 gonum 按 New Pull Request
不過我前面 git commit 沒弄好, 想修改描述, 結果變成 3個 commit...
https://github.com/gonum/gonum/pull/1131
後續:
https://njiot.blogspot.com/2019/10/github-gonum-blas-norm.html
--
繼 gonum floats Norm - vector dot product 這篇發現 Norm 做法有點慢,
做了個實驗
在這本 The GO Programming Language
第十一章 特別介紹了 Testing, 有點像 Java Unit Test
可以撰寫該 package 相關的 測試程式
並在 11.4 介紹了如何做 Benchmark
果然 GO 不虧是 21 世紀的 C 語言
首先先看一下 vector normalization
floats.go
原先做法:
可以發現, 它利用 math.Hypot() 這個函式.
每次把前次結果做平方, 加上新的 s[i] 平方值, 又再做開根號
我們試寫一個新的做法看看
很簡單, 先把各 s[i] 平方值 總合起來後, 再做 開根號
驗證:
Go 的 Test 程式 - floats_test.go
GO 會抓 檔名 *_test.go 中 func Test<Name>(t *testing.T) 來執行
並用 t.Error() 回報錯誤, ( t.Errorf() 類似 Printf, 可以設定 format )
執行只要在該目錄下, 跑 "go test" 即可
結果:
PASS
OK <執行目錄.> 0.002s
Benchmark : benchmark_test.go
檔案名稱同樣是用 _test.go 結尾, function 格式是 func Benchmark<name>(b *testing.B)
可以用 -bench= 來指定要跑的 benchmark function, 如果用 -bench=. 則會抓所有 package 中的 benchmark functions.
特別的是 for loop b.N 次數, 會用總共一秒鐘的時間來取得需要的次數
執行: $ go test -bench=.
結果:
goos: linux
goarch: amd64
BenchmarkNorm-4 30606816 36.5 ns/op
BenchmarkNorm1-4 168108007 7.16 ns/op
PASS
OK _<目錄> 3.089s
這邊 -4 代表目前 CPU 有幾核心, 也就是 GOMAXPROCS
可以發現我們修改後的方法, 比原本的快了5倍
===
github 提交
這作法是在 gonum 這個項目 - https://github.com/gonum/gonum
我們來提交看看.
1. 首先先 fork 一個到自己的 github : https://github.com/neojou/gonum
2. 在自己工作電腦上, git clone https://github.com/neojou/gonum
3. 修改 gonum/floats/floats.go
4. go test 看看
發現 會錯,
--- FAIL: TestDistance (0.00s)
floats_test.go:265: Distance does not match norm for case 1, 2. Expected 16.627687752661224, Found 16.62768775266122.
FAIL
exit status 1
FAIL gonum.org/v1/gonum/floats 0.005s
看了一下, 我們把 floats.go 中 Distance() 裡計算方式也改成我們的方式
5. git add floats/floats.go
6. git commit -s
寫完後可以用 git log 看一下
7. git push
把修改上傳到自己的 github
這時候可以再看一下有沒有要修改的, 有的話
git commit --amend
git pull
git push
8. pull request
https://help.github.com/en/articles/creating-a-pull-request-from-a-fork
到原本的 gonum 按 New Pull Request
不過我前面 git commit 沒弄好, 想修改描述, 結果變成 3個 commit...
https://github.com/gonum/gonum/pull/1131
後續:
https://njiot.blogspot.com/2019/10/github-gonum-blas-norm.html
留言
張貼留言